class Util_Model
{
/**
* Get model property by property name chain.
* Usage: Util_Model::get_prop($order, 'item', 'name')
*/
public static function get_prop()
{
$obj = func_get_arg(0);
$props = array_slice(func_get_args(), 1);
if (!is_object($obj)) {
throw new \InvalidArgumentException('First parameter must be an object');
}
foreach ($props as $prop) {
if (preg_match('/^(.*)\(\)$/', $prop, $matches)) {
$obj = call_user_func(array($obj, $matches[1]));
} else {
$obj = $obj->{$prop};
}
if (!is_object($obj)) {
break;
}
}
return is_object($obj) ? (string)$obj : $obj;
}
}
$ obj-> {$ prop} 我想知道这条线的意思,为什么这里有支撑?当 {$ prop} 为空时,为什么没有错误。如果你不理解我的问题,请留下一些我会修改它的东西。谢谢!
答案 0 :(得分:2)
$ obj-> {$ prop} 表示$obj
正在尝试访问变量$prop
中名称存在的属性。我将用一个例子来解释
class A {
public $d;
public $e;
public $f;
function X() {}
function Y() {}
function Z() {}
}
$obj = new A();
$prop = 'X';
$propVar = 'f';
$obj->{$prop}();
$obj->{$propVar};
在上面的代码中,$prop
包含值'X',因此将调用函数X,同样如果它包含值'Y'或'Z',它们将被调用。因此,可以在运行时根据变量包含的值来决定函数的调用。
对于$prop
为空的情况,没有访问任何对象,因此返回对象的引用而不抛出任何错误。
答案 1 :(得分:1)
在访问对象属性时使用Variable Variables时,这是首选语法。在此示例中,不需要括号。他们的主要目的是避免含糊不清:
$obj = (object) array(
'foo' => array('key' => 123)
);
$access = array('key' => 'foo');
var_dump($obj->{$access['key']});//will dump array(key => 123)
var_dump($obj->$access['key']);//ambiguous
后者含糊不清,因为PHP可能会将该语句称为“将$access
转换为其字符串值(即Array),使用该名称访问该属性,并获取索引{{1从该值“,或者它可能意味着,使用您在key
下找到的名称访问该媒体资源。
无论哪种方式,这个都可以有用,你的代码太过分了。你调用这样的方法是而不是一个好主意
一个有效的用例可能是在处理JSON编码数据或解析的XML DOM时,有数字键或像$access['key']
这样的键,你不能写:
foo-bar
对于这些情况,您使用变量变量表示法:
$obj->123;
$obj->foo-bar;//- is invalid