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;
        }
    }
}
?>