Подтвердить что ты не робот

PHP. Листинг. Переменная как тип объекта в foreach Loop

В следующем коде $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();
}

Как мне "отличить" (я думаю, что правильное слово) моя переменная $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();

}
4b9b3361

Ответ 1

Это сильно зависит от используемой среды IDE.

В Netbeans и IntelliJ вы можете использовать @var в комментарии:

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

Теперь IDE узнает, что переменная $имеет класс ClassName и подсказка после ->.

Вы также можете попробовать его в своей собственной среде разработки.

Вы также можете создать аннотацию @return в методе 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:

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

оба должны включить намек IDE, если ваша среда IDE достаточно любезна.

В качестве дополнительной заметки, если вы хотите использовать ее внутри собственного класса, вы можете использовать одну и ту же подпись при объявлении переменной класса:

class MyClass
{ 

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

}

Ответ 2

просто подумал, что я брошу это там для тех, кто использует phpStorm.

Я нашел способ заставить IDE автоматически заполнять методы для объекта, включив быструю проверку, прежде чем проверять, существует ли этот объект и что $var является экземпляром указанного объекта.

Пример:

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

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }

Нашел этот вопрос, ища лучший способ, но это работает для меня.

Ура!

Ответ 3

Я знаю, что этот пост старый, но я думаю, что это может кому-то помочь:

В PhpStorm работает этот путь, возможно, и в других.

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

Ответ 4

Вы всегда можете вызывать отдельную функцию изнутри foreach и объявлять класс в объявлении функции. Это может также иметь преимущество, позволяя вам повторно использовать этот код в другом месте. Например, внутри функции getPriceFromProduct ниже вы видите, как я объявляю класс $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;
    }

Ответ 5

Если вам нужны реальные объявления типов в коде, а не комментарии, которые могут быть по-разному подобраны в зависимости от среды IDE, вы можете использовать функции array_*, например, array_walk.

array_walk($quiz_object->personalities, function (Personality $p) {
    echo $existing_personality->GetQuizMakerPersonalityHTML();
});

Ответ 6

PHP не является сильным типизированным языком, как С#

Это совершенно верно в PHP

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

Существует возможность "отличать" переменные следующим образом:

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

Для объектов нет метода сборки для 'cast'