16

我有一个有很多属性的对象。一些属性的名称以相同的文本字符串开头(在我的示例中为“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 循环,但我相信一定有一个更干净的方法。有人可以指出我正确的方向吗?

4

4 回答 4

18

您可以这样做:

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

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

于 2012-11-18T12:56:18.317 回答
7

之前的两个答案都有“尝试一下,如果它不起作用,请继续”并且正在针对非常具体的情况工作。让我给你一个更通用的方法,遗憾的是,它需要 PHP 5。

一点关于反射

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

为此,首先启动您的反射对象(假设您的类对象是 $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);
}

完毕。完全通用,可在任何地方使用。

于 2012-11-18T13:02:44.087 回答
6
$var = 'myVariable';
$value = $object->$var;

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

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

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

     if ($objectName->$var)
     {
          echo $info->$var;
     }
}
于 2012-11-18T12:54:18.923 回答
1

在我的系统中,这不允许我这样做

$myPropertyValue = $object->$property;

我仍然可以使用以下函数获取“变量”属性名称的值;您可以设置 $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;
        }
    }
}
?>
于 2015-06-15T12:51:03.207 回答