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, но я уверен, что должен быть более чистый способ. Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
Вот как вы можете это сделать:
for ($i = 1; $i <= 20; $i++){
$propertyName = "bullet$i";
if ($objectName->$propertyName){
echo $info->$propertyName;
}
}
Хотя я думаю, что использование массива вместо объекта было бы лучшим решением.
Ответ 2
$var = 'myVariable';
$value = $object->$var;
- правильный синтаксис для доступа к полю по имени в PHP.
В вашем случае это будет выглядеть примерно так:
for ($i = 1; $i <= 20; $i++)
{
$var = 'bullet'.$i;
if ($objectName->$var)
{
echo $info->$var;
}
}
Ответ 3
В обоих предыдущих ответах есть "попробуйте, если он не работает, перейдите" и работают в очень конкретной ситуации. Позвольте мне дать вам более общий подход, который, к сожалению, требует 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);
}
Готово. Полностью общий, работает где угодно.
Ответ 4
в моей системе, что не позволяет мне делать
$myPropertyValue = $object->$property;
Я все еще могу получить значение имени свойства "variable" с приведенной ниже функцией; вы можете установить свойство $без 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;
}
}
}
?>