Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将变量转换为foreach循环中的对象类型_Php_Casting_Foreach - Fatal编程技术网

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

PHP将变量转换为foreach循环中的对象类型,php,casting,foreach,Php,Casting,Foreach,在下面的代码中,$quick\u object->personalies包含一个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_per

在下面的代码中,
$quick\u object->personalies
包含一个
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\u personality
作为对象类型“强制转换”(我认为这是正确的词)

我希望这样做,以便在键入
$existing\u personality->
时,可以获得该对象类型可用的公共函数列表

更新

目前,Zend Studio不知道我正在循环循环中的
Personality
对象数组,它只是认为这是一个标准变量。然而,它是一种类型,我的代码工作得非常好。我只想在foreach循环中得到变量的IDE提示

为了让我清楚,如果我有:

$personality_object = new Personality();

// I get the IDE hints here
echo $personality_object->MyFunction();
但一旦我开始在foreach中循环,Zend就无法知道我正在循环一系列对象

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

class Personality
{

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

}

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

在Netbeans和IntelliJ中,您可以在注释中使用
@var

/* @var $variable ClassName */
$variable->
IDE现在将知道$variable是类名称,并在
->
之后提示

您也可以在自己的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:

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

另外,如果您想在其自己的类中使用它,则可以在声明类变量时使用相同的签名:

class MyClass
{ 

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

}

我想我会把这个给那些使用phpStorm的人

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

例如:

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

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }
在寻找更好的方法时发现了这个问题,但上面的方法对我很有效


干杯

您始终可以从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;
    }

我知道这篇文章很老,但我认为这可能会帮助一些人:

在PhpStorm中,可能也是这样

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

如果您希望在代码中使用实际的类型声明,而不是根据IDE选择不同的注释,例如,您可以使用
array.*
函数


你说的是启用IDE提示吗?我会得到其他所有对象的提示,但不会得到foreach循环中的提示。是的,但是你在运行代码时会出现错误吗,还是只是你的IDE太差劲了?在阅读了这个建议之后,我带着同样的挑战开始使用array_walk。我发现这种技术需要将局部变量作为参数传递给函数,因为它们在包含数组的函数的作用域中,而不在闭包函数的作用域中。一旦你意识到你需要的不仅仅是几个变量,这就开始显得不雅观了。在这一点上,我认为应该考虑其他建议之一,甚至可能只是将元素var重新设计为一个新的元素,并对UI进行强制转换,如:
$casted=(class)$element
casting是否独立于IDE?如果独立于IDE就好了,但由于php不是强类型的,这只是对特定IDE的一个建议。然后取决于IDE如何解释暗示。有人知道如何在VisualStudio代码中获得同样的效果吗?上面的解决方案适用于NetBeans PHP,但我非常感谢VS代码的解决方案。太棒了,非常感谢!你的
/**@var…。
提示救了我,因为它也在phpsform中工作:)
/*@var$variable ClassName*/
也在EclipseGraat中工作,以了解!另外,来自另一个答案的
/**@var$variableName ClassName*/
方法也适用于PhpStorm。虽然,它不做任何真正的类型检查,当然:)太棒了!如果您有一个成员变量,您也可以使用
/***@var ClassName[]*/
以自己的方式记录它,并且它在类中的所有位置都有类型提示。如果您通过某个getter使该成员可用,那么即使没有明确记录getter函数的返回值,使用者也会得到类型提示。
/**
 * @param ClassName[] $variables
 */
public function loopFunction($variables){
    foreach ($variables as $variable) {
        echo $variable->functionName();
    }
}
array_walk($quiz_object->personalities, function (Personality $p) {
    echo $existing_personality->GetQuizMakerPersonalityHTML();
});