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

时间:2012-09-13 15:36:34

标签: php casting 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个对象,它只是认为它是一个标准变量。但是,它是一种类型,我的代码运行得非常好。我只想在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();

}

6 个答案:

答案 0 :(得分:69)

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

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

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

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

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

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

}

答案 1 :(得分:8)

我以为我会把那些用于那些使用phpStorm的人。

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

示例:

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

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }

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

干杯!

答案 2 :(得分:4)

我知道这篇文章已经过时但我认为这可能有助于某人:

在PhpStorm这样工作,也许在其他方面。

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

答案 3 :(得分: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;
    }

答案 4 :(得分:1)

如果您希望代码中存在实际的类型声明,而不是根据IDE可以采用不同的注释,则可以使用array_*函数,例如array_walk

array_walk($quiz_object->personalities, function (Personality $p) {
    echo $existing_personality->GetQuizMakerPersonalityHTML();
});

答案 5 :(得分:-1)

PHP不是像C#

这样的强类型语言

这在PHP中完全没问题

$i = 0;
$i = 'Hello World';
echo $i;

有可能像这样'施放'变量:

$i = '12.3';
echo (int)$i;

对于对象,没有构建方法来“强制转换”