У меня есть объект с большим количеством свойств. Некоторые из свойств имеют имена, начинающиеся с одной и той же строки текста (в моем примере – «bullet»), за которым следует целое число.
Я могу получить значения свойств следующим образом:
echo $objectName->bullet1; echo $objectName->bullet2; echo $objectName->bullet3;
и так далее.
Я пытаюсь написать цикл for, чтобы получить первые 20 из них, и на данный момент это выглядит примерно так:
for ($i = 1; $i <= 20; $i++){ if ($objectName->bullet$i){ echo $objectName->bullet$i; } }
Но это не работает. Я знаю, что могу написать что-то вроде
$bulletsArray[1] = $objectName->bullet1; $bulletsArray[2] = $objectName->bullet2; $bulletsArray[3] = $objectName->bullet3;
до 20, затем установите цикл for, но я уверен, что должен быть более чистый способ. Может ли кто-нибудь указать мне в правильном направлении?
Так вы можете это сделать:
for ($i = 1; $i <= 20; $i++){ $propertyName = "bullet$i"; if ($objectName->$propertyName){ echo $info->$propertyName; } }
Хотя я думаю, что использование массива вместо объекта было бы лучшим решением.
$var = 'myVariable'; $value = $object->$var;
является правильным синтаксисом для доступа к полю по имени в PHP.
В вашем случае это будет выглядеть примерно так:
for ($i = 1; $i <= 20; $i++) { $var = 'bullet'.$i; if ($objectName->$var) { echo $info->$var; } }
В обоих предыдущих ответах есть «попробуйте, если он не работает, перейдите» и работают в очень конкретной ситуации. Позвольте мне дать вам более общий подход, который, к сожалению, требует PHP 5.
Немного о отражении
Отражение позволяет вам отражать объект или класс для извлечения полезной информации об этом. В частности, вы можете использовать Reflection, чтобы получить все свойства, заданные в классе, будь то статические, во время выполнения или сгенерированные на ходу.
Для этого начните с инициализации объекта Reflection (если ваш объект класса является $ object) следующим образом:
$refObj = new ReflectionObject($object);
Теперь это даст вам интерфейс для отражения. Обратите внимание на полезный метод ReflectionObject::getProperties()
– он позволяет вам получить все свойства, заданные в классе (и вы можете фильтровать по общедоступным, защищенным, приватным и т. Д.), Если это необходимо). Мы будем использовать именно это:
$yourNewArray = array(); $PropertyArray = $refObj->getProperties(); $pCount = count($PropertyArray); for ($i = 0; $i < $pCount; $i++) { $yourNewArray[$PropertyArray[$i]->getName()] = $PropertyArray[$i]->getValue($object); }
Готово. Полностью общий, работает в любом месте.
в моей системе, что не позволяет мне делать
$myPropertyValue = $object->$property;
Я все еще могу получить значение имени переменной «variable» с приведенной ниже функцией; вы можете установить $ property без php, жалуясь на синтаксис или ошибки бросания.
<?php class MyClass{ public function getProperty($propertyName){ $props=get_object_vars($this); if (array_key_exists($propertyName,$props)){ return $props[$propertyName]; }else{ return FALSE; } } } ?>