括号是什么意思?

时间:2014-10-21 10:13:36

标签: php

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} 为空时,为什么没有错误。如果你不理解我的问题,请留下一些我会修改它的东西。谢谢!

2 个答案:

答案 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