У меня есть объект с большим количеством свойств. Некоторые из свойств имеют имена, начинающиеся с одной и той же строки текста (в моем примере – «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; } } } ?>