PHP - 按变量获取对象属性

Jac*_*ack 16 php syntax object

我有一个有很多属性的对象.一些属性的名称以相同的文本字符串开头(在我的示例中为"bullet"),后跟一个整数.

我可以按如下方式获取属性值:

echo $objectName->bullet1;
echo $objectName->bullet2;
echo $objectName->bullet3;
Run Code Online (Sandbox Code Playgroud)

等等.

我正在尝试编写一个for循环来获取前20个,现在它看起来有点像:

for ($i = 1; $i <= 20; $i++){
 if ($objectName->bullet$i){
  echo $objectName->bullet$i;
 }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我知道我可以写类似的东西

$bulletsArray[1] = $objectName->bullet1;
$bulletsArray[2] = $objectName->bullet2;
$bulletsArray[3] = $objectName->bullet3;
Run Code Online (Sandbox Code Playgroud)

一直到20,然后对它进行循环,但我敢肯定必须有一个更清洁的方式.有人能指出我正确的方向吗?

Bot*_*ázs 17

这是你如何做到的:

for ($i = 1; $i <= 20; $i++){
    $propertyName = "bullet$i";
    if ($objectName->$propertyName){
        echo $info->$propertyName;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我认为使用数组而不是对象将是一个更好的解决方案.

  • 重要警告:这将引发 E_STRICT 警告。 (2认同)

Séb*_*uld 7

以前的答案都有"尝试它,如果它不起作用,继续前进",并且正在为一个非常具体的情况而努力.让我给你一个更通用的方法,遗憾的是,需要PHP 5.

关于反思

Reflection允许您反映对象或类以提取有关它的有用信息.特别是,您可以使用Reflection来获取类中设置的所有属性,无论是静态,运行时还是随时生成.

要做到这一点,首先启动您的Reflection对象(假设您的类对象是$ object),如下所示:

$refObj = new ReflectionObject($object);
Run Code Online (Sandbox Code Playgroud)

现在,这将为您提供一个反射界面.请注意有用的ReflectionObject::getProperties()方法 - 它允许您获取在类中设置的所有属性(并且您可以按公共,受保护,私有等过滤...如果需要).我们将使用这个:

$yourNewArray = array();
$PropertyArray = $refObj->getProperties();
$pCount = count($PropertyArray);
for ($i = 0; $i < $pCount; $i++) {
   $yourNewArray[$PropertyArray[$i]->getName()] = $PropertyArray[$i]->getValue($object);
}
Run Code Online (Sandbox Code Playgroud)

完成.完全通用,适用于任何地方.


Luc*_*ius 6

$var = 'myVariable';
$value = $object->$var;
Run Code Online (Sandbox Code Playgroud)

是在PHP中按名称访问字段的正确语法.

在你的情况下,它看起来像这样:

for ($i = 1; $i <= 20; $i++) 
{
     $var = 'bullet'.$i;

     if ($objectName->$var)
     {
          echo $info->$var;
     }
}
Run Code Online (Sandbox Code Playgroud)