2012-09-13 17 views
21

En el siguiente código, $quiz_object->personalities contiene una matriz de Personality objetos.PHP reparto variable como tipo de objeto en bucle 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(); 
} 

¿Cómo "echo" (creo que esa es la palabra correcta) mi variable de $existing_personality dentro del bucle foreach como el tipo de objeto?

Deseo hacer esto para que cuando escribo $existing_personality->, obtenga la lista de funciones públicas disponibles para ese tipo de objeto.

ACTUALIZACIÓN

Por el momento, Zend Studio no sabe que estoy bucle a través de una serie de objetos Personality dentro del bucle, que sólo piensa que es una variable estándar. Sin embargo, se trata de un tipo y mi código funciona perfectamente bien. Sólo quiero los consejos IDE en mi variable dentro del bucle foreach.

sólo para que yo estoy claro, los consejos aparecer para todos los demás objetos, si tengo:

$personality_object = new Personality(); 

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

Pero tan pronto como comience en un bucle foreach, Zend no tiene manera de saber que yo Estoy recorriendo un conjunto de Objetos.

Esta es la forma en la gama de personalidades se define inicialmente dentro de mi Personality objeto:

class Personality 
{ 

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

} 
+1

¿Estás hablando de habilitar sugerencias de IDE? – deceze

+0

¿Aparece un error? – jurgemaister

+0

Obtengo las sugerencias para cada otro objeto, pero no para los que tengo en los bucles foreach. – Luke

Respuesta

45

Es mucho depende de la IDE que está utilizando.

En Netbeans y IntelliJ que son capaces de utilizar @var en un comentario:

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

El IDE ahora sabrá que la variable $ es el nombre de clase de la clase y su pista después de la ->.

Puede probarlo en su propia IDE también.

También puede crear una anotación de @return en un método getPersonalities() afirmando que el retorno será un ClassName[], lo que significa una matriz de objetos Nombre de clase:

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

esto también depende de cómo su IDE es la interpretación de este tipo de insinuar

usar esto en foreach bucles que puede hacer 1:

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

o 2:

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

tanto deberían permitir insinuando IDE, si su IDE es bastante bueno.

Como nota adicional, si se desea utilizar esta dentro de su propia clase, puede utilizar la misma firma cuando se declara una variable de clase:

class MyClass 
{ 

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

} 
+1

Genial, '/ * @var $ existing_personality Personality * /' funciona! Estoy usando el IDE en Zend Studio de forma predeterminada. – Luke

+0

Genial para escuchar. Diviértete con eso. – Krycke

+0

perfecto gracias –

-1

PHP no es un lenguaje con tipos fuertes como C#

Esto es perfectamente Allright en PHP

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

Existe la posibilidad de que las variables 'elenco' como esto:

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

Para los objetos, no hay acumulación en el método de 'fundido'

+0

Gracias por la respuesta, sin embargo, creo que ha entendido mal mi problema. Por favor, mira la actualización, he tratado de aclarar mi problema. Proporciona pistas IDE, pero no para bucles foreach, porque Zend Studio no sabe por mi código que se trata de una matriz de objetos. – Luke

7

simplemente pensé en tirar esto en allí para aquellos usando phpStorm.

Encontré la manera de conseguir que el IDE autocompletara los métodos para un objeto incluyendo una comprobación rápida antes y comprobando que el objeto existe y que $ var era una instancia de dicho objeto.

Ejemplo:

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

       $obj->thisMethodShouldBeAvailableInPHPStormNow(); 

      } 

Encontrado esta pregunta durante la búsqueda de una mejor manera, pero lo anterior funciona para mí.

¡Salud!

3

Siempre puede llamar a una función separada desde el foreach y declarar la clase en la declaración de la función. Esto también podría tener el beneficio de permitirle reutilizar este código en otro lugar. Por ejemplo, dentro de la función getPriceFromProduct a continuación, verá cómo declaro que la clase de $ producto es Producto.

Por supuesto, estoy de acuerdo, sería bueno no tener que hacerlo de esta manera, pero bueno, funciona.

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

Sé que este post es viejo, pero creo que esto puede ayudar a alguien:

En PhpStorm funciona de esta manera, tal vez en otros también.

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