2012-09-13 12 views
21

All'interno del codice seguente, $quiz_object->personalities contiene un array di oggetti Personality.Casting PHP Variabile come tipo di oggetto nel ciclo 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(); 
} 

Come faccio a "cast" (credo che sia la parola giusta) il mio $existing_personality all'interno del ciclo foreach variabile come il tipo di oggetto?

Desidero fare in modo che quando digito $existing_personality->, ottenga l'elenco delle funzioni pubbliche disponibili per quel tipo di oggetto.

UPDATE

Al momento, Zend Studio non sa che sto loop attraverso una serie di Personality oggetti all'interno del ciclo, semplicemente pensa che sia una variabile standard. Tuttavia, è un tipo e il mio codice funziona perfettamente. Voglio solo i suggerimenti IDE sulla mia variabile all'interno del ciclo foreach.

Just so che sto chiaro, i suggerimenti visualizzati per ogni altro oggetto, se ho:

$personality_object = new Personality(); 

// I get the IDE hints here 
echo $personality_object->MyFunction(); 

Ma appena comincio loop in un foreach, Zend non ha alcun modo di sapere che ho Sto scorrendo una serie di oggetti.

Questo è come la matrice di personalità è definito inizialmente nel mio Personality oggetto:

class Personality 
{ 

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

} 
+1

Stai parlando di abilitare i suggerimenti IDE? – deceze

+0

Hai ricevuto un errore? – jurgemaister

+0

Ottengo i suggerimenti per ogni altro oggetto, ma non per quelli che ho in foreach loop. – Luke

risposta

45

Dipende molto dal IDE che si sta utilizzando.

In Netbeans e IntelliJ si sono in grado di utilizzare @var in un commento:

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

L'IDE ora sappiamo che $ variabile è del NomeClasse di classe e suggerimento dopo il ->.

Puoi provarlo anche nel tuo IDE.

È anche possibile creare un @return annotazione in un metodo getPersonalities() affermando che il ritorno sarà un ClassName[], il che significa un array di oggetti NomeClasse:

/** 
* Returns a list of Personality objects 
* @return Personality[] 
*/ 
function getPersonalities() { 
    return $this->personalities; 
} 

questo dipende anche da come il vostro IDE sta interpretando questo tipo di suggerimento.

di utilizzare questo nel foreach loop si può fare 1:

/* @var $existing_personality Personality */ 
foreach($quiz_object->personalities as $existing_personality){ 
} 

o 2:

foreach($quiz_object->getPersonalities() as $existing_personality){ 
} 

entrambi dovrebbero consentire IDE hinting, se il vostro IDE è abbastanza gentile.

Come nota in più, se si desidera utilizzare questo all'interno di essa la propria classe, è possibile utilizzare la stessa firma quando si dichiara una variabile di classe:

class MyClass 
{ 

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

} 
+1

Grande, '/ * @var $ personality_personality Personality * /' funziona! Per impostazione predefinita sto utilizzando l'IDE in Zend Studio. – Luke

+0

Ottimo per ascoltare. Divertiti con esso. – Krycke

+0

perfetto grazie –

-1

PHP non è un linguaggio tipizzato forte come C#

Questo è perfettamente allright in PHP

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

Esiste la possibilità di "trasmettere" variabili come questa:

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

Per gli oggetti, non c'è costruire in metodo per 'lanciare'

+0

Grazie per la risposta, tuttavia penso che tu abbia frainteso il mio problema. Si prega di consultare l'aggiornamento, ho cercato di chiarire il mio problema. Fornisce suggerimenti IDE, ma non solo all'interno di foreach loop, perché Zend Studio non sa dal mio codice che si tratta di una schiera di oggetti. – Luke

7

Ho solo pensato di buttare questo in là per coloro usando phpStorm.

Ho trovato il modo di ottenere l'IDE per popolare automaticamente i metodi per un oggetto includendo un controllo rapido se prima e dopo aver verificato che l'oggetto esiste e che $ var era un'istanza di detto oggetto.

Esempio:

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

       $obj->thisMethodShouldBeAvailableInPHPStormNow(); 

      } 

Trovato questa domanda durante la ricerca di un modo migliore, ma i lavori di cui sopra per me.

Cheers!

3

È sempre possibile chiamare una funzione separata all'interno di foreach e dichiarare la classe nella dichiarazione di funzione. Questo potrebbe anche avere il vantaggio di permetterti di riutilizzare questo codice altrove. Per esempio all'interno della funzione getPriceFromProduct qui sotto, puoi vedere come dichiaro la classe di $ prodotto come Prodotto.

Naturalmente sono d'accordo che sarebbe bello non doverlo fare in questo modo ma, ehi, funziona.

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

So che questo post è vecchio, ma penso che questo possa aiutare qualcuno:

In PhpStorm funziona in questo modo, magari in altri troppo.

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