2012-09-13 74 views
21

在以下代碼中,$quiz_object->personalities包含一個Personality對象的數組。PHP Casting變量作爲foreach中的對象類型循環

// 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->時,我得到該對象類型可用的公共函數列表。

UPDATE

目前,Zend Studio的不知道我通過內環路Personality對象的數組循環,它只是認爲這是一個標準的變量。但是,它是一種類型,我的代碼工作得很好。我只想讓IDE在foreach循環中提示我的變量。

只是讓我清楚,提示出現每隔對象,如果我有:

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

} 
+1

你剛剛在談論啓用IDE提示嗎? – deceze

+0

你有錯誤嗎? – jurgemaister

+0

我得到每個其他對象的提示,但不是我在foreach循環中的提示。 – Luke

回答

45

這完全取決於你所使用的IDE。

在NetBeans和IntelliJ您可以在評論使用@var

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

IDE現在都知道,$變量是className類和->後暗示。

你也可以在你自己的IDE中嘗試一下。

您還可以創建一個@return註釋在getPersonalities()方法,指出返回的將是一個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

很好,'/ * @var $ existing_personality個性* /'起作用!我在默認情況下在Zend Studio中使用IDE。 – Luke

+0

好聽。玩得開心。 – Krycke

+0

完美謝謝 –

-1

PHP並不像C#中的強類型語言

這是PHP

$i = 0; 
$i = 'Hello World'; 
echo $i; 
完美好吧

有可能「鑄造」像這樣的變量:

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

對於對象,也沒有建立的方法來「投」

+0

感謝您的回覆,但我認爲您誤解了我的問題。請參閱更新,我試圖澄清我的問題。它提供了IDE提示,但不適用於foreach循環,因爲Zend Studio不知道從我的代碼中得知它是一個對象數組。 – Luke

7

只是想我會扔這有那些使用phpStorm。

我發現讓IDE自動填充對象方法的方法是在檢查之前檢查對象是否存在,並確認$ var是所述對象的實例。

例子:

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

       $obj->thisMethodShouldBeAvailableInPHPStormNow(); 

      } 

發現了這個問題,同時尋找一種更好的方式,但對我的上述工程。

乾杯!

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; 
    } 
3

我知道這個職位是舊的,但我認爲這可能幫助別人:

在PhpStorm以這種方式工作,也許在別人太多。

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