在以下代码中,$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();
}
答案 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;
对于对象,没有构建方法来“强制转换”