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

新手上路,请多包涵

在以下代码中, $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();
}

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

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

更新

目前,Zend Studio 不知道我正在遍历 Personality 循环中的对象数组,它只是认为这是一个标准变量。但是,它是一种类型,我的代码运行良好。我只希望 IDE 在 foreach 循环中提示我的变量。

为了清楚起见,如果我有:

 $personality_object = new Personality();

// I get the IDE hints here
echo $personality_object->MyFunction();

但是一旦我开始在 foreach 中循环,Zend 就无法知道我正在循环对象数组。

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

 class Personality
{

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

}

原文由 Luke 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 311
2 个回答

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

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

 /* @var $variable ClassName */
$variable->

IDE 现在将知道 $variable 属于类 ClassName 并在 -> 之后提示。

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

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

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

这也取决于您的 IDE 如何解释这种类型的提示。

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

 /* @var $existing_personality Personality */
foreach( $quiz_object->personalities as $existing_personality ){
}

或 2:

 foreach( $quiz_object->getPersonalities() as $existing_personality ){
}

如果您的 IDE 足够好,两者都应该启用 IDE 提示。

作为额外说明,如果你想在它自己的类中使用它,你可以在声明类变量时使用相同的签名:

 class MyClass
{

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

}

原文由 Krycke 发布,翻译遵循 CC BY-SA 3.0 许可协议

只是想我会把它扔给那些使用 phpStorm 的人。

我找到了让 IDE 自动填充对象方法的方法,方法是包括一个快速的 if 检查,然后检查对象是否存在以及 $var 是所述对象的一个实例。

例子:

 foreach ($objArray as $obj) {
    if (is_object($obj) && $obj instanceof DataObject) {
        $obj->thisMethodShouldBeAvailableInPHPStormNow();
    }
}

在寻找更好的方法时发现了这个问题,但以上对我有用。

干杯!

原文由 lordvig 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏