PHP将变量转换为foreach循环中的对象类型

Luk*_*uke 30 php foreach casting

在以下代码中,$quiz_object->personalities包含一个Personality对象数组.

// Loop through each personality that exists for the quiz
foreach($quiz_object->personalities AS $existing_personality)
{

    // Show all of the existing personalities
    echo $existing_personality->GetQuizMakerPersonalityHTML();
}
Run Code Online (Sandbox Code Playgroud)

我如何"转换"(我认为这是正确的词)我的变量$existing_personality在foreach循环中作为对象类型?

我希望这样做,以便当我键入时$existing_personality->,我获得该对象类型可用的公共函数列表.

UPDATE

目前,Zend Studio不知道我循环遍历循环中的一系列Personality对象,它只是认为它是一个标准变量.但是,它是一种类型,我的代码运行得非常好.我只想在foreach循环中对我的变量进行IDE提示.

只是为了让我清楚,如果我有以下内容,则每个其他对象都会显示提示:

$personality_object = new Personality();

// I get the IDE hints here
echo $personality_object->MyFunction();
Run Code Online (Sandbox Code Playgroud)

但是当我开始在foreach中循环时,Zend无法知道我正在循环遍历一个对象数组.

这就是最初在我的Personality对象中定义个性数组的方式:

class Personality
{

    // Array of Personality objects
    public $personalities = array();

}
Run Code Online (Sandbox Code Playgroud)

Kry*_*cke 76

这在很大程度上取决于您使用的IDE.

在Netbeans和IntelliJ中,您可以@var在评论中使用:

/* @var $variable ClassName */
$variable->
Run Code Online (Sandbox Code Playgroud)

IDE现在将知道$ variable是类ClassName并在提示之后提示->.

您也可以在自己的IDE中试用它.

您还可以@returngetPersonalities()方法中创建注释,声明返回将是a ClassName[],这意味着ClassName对象的数组:

/**
 * Returns a list of Personality objects
 * @return Personality[]
 */
function getPersonalities() {
    return $this->personalities;
}
Run Code Online (Sandbox Code Playgroud)

这还取决于您的IDE如何解释此类提示.

要在foreach循环中使用它,您可以执行1:

/* @var $existing_personality Personality */
foreach( $quiz_object->personalities as $existing_personality ){
}
Run Code Online (Sandbox Code Playgroud)

或2:

foreach( $quiz_object->getPersonalities() as $existing_personality ){
}
Run Code Online (Sandbox Code Playgroud)

如果您的IDE足够友好,它们都应该启用IDE提示.

另外注意,如果你想在它自己的类中使用它,你可以在声明一个类变量时使用相同的签名:

class MyClass
{ 

    /** 
    * @var ClassName[] $variable List of ClassName objects. 
    */ 
    var $variable;

}
Run Code Online (Sandbox Code Playgroud)


小智 9

我以为我会把它扔给那些使用phpStorm的人.

我发现让IDE自动填充对象方法的方法是在检查对象存在之前包括一个快速if检查,并且$ var是所述对象的实例.

例:

            foreach ($objArray as $obj) {
            if (is_object($obj) && $obj instanceof DataObject) {

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }
Run Code Online (Sandbox Code Playgroud)

在寻找更好的方法的同时找到了这个问题,但上述内容对我有用.

干杯!


Dan*_*ero 6

我知道这篇文章很旧,但我认为这可能对某人有所帮助:

在 PhpStorm 中以这种方式工作,也许在其他人中也是如此。

/**
 * @param ClassName[] $variables
 */
public function loopFunction($variables){
    foreach ($variables as $variable) {
        echo $variable->functionName();
    }
}
Run Code Online (Sandbox Code Playgroud)