提问人:user658182 提问时间:9/25/2012 最后编辑:j0kuser658182 更新时间:3/8/2020 访问量:114692
如何动态编写PHP对象属性名称?
How do I dynamically write a PHP object property name?
问:
我的代码中有如下所示的对象属性:
$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
问题是我有 100 多个字段名称,需要动态写入属性名称。否则,属性的对象名称和键将始终相同。所以我试了一下:
$obj -> $field[0];
希望动态更改属性的名称并访问正确的值。但是,我一直在 stdClass::$field 中得到“未定义的属性$field;
我或多或少地尝试在php执行之前动态编写php,以便它可以输出正确的值。关于如何处理这个问题的想法?
答:
PHP 7.0 更新
PHP 7 引入了对解析器级别处理间接变量和属性的方式的更改(有关详细信息,请参阅相应的 RFC)。这使实际行为更接近预期,并意味着在这种情况下将产生预期的结果。$obj->$field[0]
如果不需要(现已改进的)默认行为,仍然可以使用大括号来覆盖它,如下所示。
原始答案
像这样编写访问权限:
$obj->{$field}[0]
这种“用大括号括起来”的技巧在 PHP 中很有用,只要由于变量而出现歧义。
考虑初始代码 -- 这是否意味着“访问名称在 ”中给出的属性,或者“使用名称在 ”中给出的属性的键访问元素?大括号允许您明确。$obj->$field[0]
$field[0]
0
$field
评论
我认为您正在寻找变量-变量类型表示法,当从其他数组/对象访问值时,最好使用大括号语法来实现,如下所示:
$obj->{field[0]}
神奇的方法__get是你的朋友:
class MyClass
{
private $field = array();
public function __get($name)
{
if(isset($this->field[$name]))
return $this->field[$name];
else
throw new Exception("$name dow not exists");
}
}
用法:
$myobj = new MyClass();
echo $myobj->myprop;
说明:所有字段数据都存储在数组中。当您访问该属性时,该属性显然在类中不存在。这就是被召唤的地方。 在数组中查找名称并返回正确的值。$myobj->myprop
__get
__get
field
评论
我处理了一些使用动态创建的对象属性的代码。我认为使用动态创建的对象属性非常酷(在我看来是真的)。但是,我的程序运行了 7 秒。我删除了动态对象属性,并替换了它们作为每个类(在本例中为公共类)的一部分声明的对象属性。CPU 时间从 7 秒多增加到 0.177 秒。这是相当可观的。
我可能在使用动态对象属性的方式上做错了什么。我的配置也有可能以某种方式被破坏。当然,我应该说我的机器上有一个非常普通的 PHP 配置。
评论
今天,我面临着这一挑战。我最终选择了这种开发风格
$countTickets = new \stdClass;
foreach ($tickets as $key => $value) {
if(!isset($countTickets->total)){
$countTickets->total = 0;
}
if(!isset($countTickets->{$value['categoryname']})){
$countTickets->{$value['categoryname']} = 0;
}
$countTickets->total += $value['number'];
$countTickets->{$value['categoryname']} += $value['number'];
}
评论