我有一个有很多属性的对象。一些属性的名称以相同的文本字符串开头(在我的示例中为“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循环,但我确信必须有一个更清洁的方式。有人能指出我正确的方向吗?
答案 0 :(得分:17)
这是你可以做到的:
for ($i = 1; $i <= 20; $i++){
$propertyName = "bullet$i";
if ($objectName->$propertyName){
echo $info->$propertyName;
}
}
虽然我认为使用数组代替对象会是更好的解决方案。
答案 1 :(得分:6)
$var = 'myVariable';
$value = $object->$var;
是在PHP中按名称访问字段的正确语法。
在你的情况下,它看起来像这样:
for ($i = 1; $i <= 20; $i++)
{
$var = 'bullet'.$i;
if ($objectName->$var)
{
echo $info->$var;
}
}
答案 2 :(得分:6)
之前的答案都有“试一试,如果它不起作用,继续前进”,并且正在为一个非常具体的情况而努力。让我给你一个更通用的方法,遗憾的是,它需要PHP 5。
关于反思
Reflection允许您反映对象或类以提取有关它的有用信息。特别是,您可以使用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);
}
完成。完全通用,适用于任何地方。
答案 3 :(得分:1)
在我的系统中,它不允许我这样做
$myPropertyValue = $object->$property;
我仍然可以获得&#39;变量&#39;的价值。具有以下功能的属性名称;你可以在没有php抱怨语法或抛出错误的情况下设置$ property。
<?php
class MyClass{
public function getProperty($propertyName){
$props=get_object_vars($this);
if (array_key_exists($propertyName,$props)){
return $props[$propertyName];
}else{
return FALSE;
}
}
}
?>