Intereting Posts
Сравнение временной отметки с текущим временем из базы данных Не удалось подключиться к Google cloud SQL. Использование PHP SDK Google Перевод Yii2 не работает Как настроить код для функционального тестирования с помощью Symfony2? Выбор данных из mySQL с использованием идентификатора в URL-адресе Как отменить доступ к Microsoft APP для пользователя в php Отдельное название улицы с номера улицы Ошибка Android при анализе json, когда ключ массива имеет большую длину Как разрешить загрузку файлов с помощью PHP, но запретить прямой доступ к спискам каталогов Заказ результатов запроса XPath Возврат первых элементов x из массива PHP Предупреждение: деление на ноль PHP Pack / unpack – может обрабатывать строки переменной длины читать содержимое внешней веб-страницы и получать конкретные элементы нет рабочего отключения текстового поля, когда записи больше одного

PHP – Получить свойства объекта по переменной

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