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();
}
Ответы
Ответ 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'