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