40

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

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

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

更新

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

为了清楚起见,如果我有,其他所有对象都会出现提示:

$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();

}
4

5 回答 5

104

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

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

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

IDE 现在将知道 $variable 属于 ClassName 类并在->.

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

您还可以在方法中创建@return注释,getPersonalities()说明返回将是 a 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;

}
于 2012-09-13T16:10:18.190 回答
13

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

我发现让 IDE 自动填充对象的方法的方法是预先包含快速 if 检查并检查对象是否存在以及 $var 是所述对象的实例。

例子:

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

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }

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

干杯!

于 2014-02-05T01:21:30.507 回答
7

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

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

/**
 * @param ClassName[] $variables
 */
public function loopFunction($variables){
    foreach ($variables as $variable) {
        echo $variable->functionName();
    }
}
于 2016-05-13T07:56:16.977 回答
3

您始终可以从 foreach 中调用一个单独的函数,并在函数声明中声明该类。这可能还具有让您在其他地方重用此代码的好处。例如在下面的函数getPriceFromProduct中,您会看到我如何将 $product 的类声明为 Product。

当然,我同意不必这样做会很好,但是嘿,它有效。

class ProductBundle {

  private $products; //buy this
  public function get_products() { return $this->products; }
  public function add_product($product) { $this->products[] = $product; }

  public function get_price() {
        $products = $this->get_products();
        $prices = array();
        foreach($products as $product) {
            $prices[] = $this->getPriceFromProduct($product);
        }
        return array_sum($prices);
    }

    private function getPriceFromProduct(Product $product) {
        $price = $product->get_price();
        return $price;
    }
于 2014-10-16T22:55:16.500 回答
1

如果您想要代码中的实际类型声明,而不是可能根据 IDE 以不同方式获取的注释,您可以使用array_*函数,例如array_walk.

array_walk($quiz_object->personalities, function (Personality $p) {
    echo $existing_personality->GetQuizMakerPersonalityHTML();
});
于 2018-03-19T16:51:40.633 回答