Php 大括号是什么意思?
$obj->{$prop}我想知道这行的意思,为什么这里有一个大括号?还有为什么{$prop}为空时没有错误。如果您不理解我的问题,请留下一些内容,我会修改它。谢谢 $obj->{$prop}表示Php 大括号是什么意思?,php,Php,$obj->{$prop}我想知道这行的意思,为什么这里有一个大括号?还有为什么{$prop}为空时没有错误。如果您不理解我的问题,请留下一些内容,我会修改它。谢谢 $obj->{$prop}表示$obj试图访问一个属性,该属性的名称出现在变量$prop中。我将用一个例子来解释 class Util_Model { /** * Get model property by property name chain. * Usage: Util_Model::get_prop($order, 'i
$obj
试图访问一个属性,该属性的名称出现在变量$prop
中。我将用一个例子来解释
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;
}
}
在上面的代码中,$prop
包含值“X”,因此将调用函数X,同样,如果函数X包含值“Y”或“Z”,将调用它们。因此,函数的调用可以在运行时根据变量包含的值来决定
至于
$prop
为null时,没有对象被访问,因此返回对象的引用,不会抛出错误。$obj->{$prop}表示$obj
正在尝试访问变量$prop
中存在名称的属性。我将用一个例子来解释
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;
}
}
在上面的代码中,$prop
包含值“X”,因此将调用函数X,同样,如果函数X包含值“Y”或“Z”,将调用它们。因此,函数的调用可以在运行时根据变量包含的值来决定
至于
$prop
为null时,没有对象被访问,因此返回对象的引用,不会抛出错误。$obj->{$prop}表示$obj
正在尝试访问变量$prop
中存在名称的属性。我将用一个例子来解释
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;
}
}
在上面的代码中,$prop
包含值“X”,因此将调用函数X,同样,如果函数X包含值“Y”或“Z”,将调用它们。因此,函数的调用可以在运行时根据变量包含的值来决定
至于
$prop
为null时,没有对象被访问,因此返回对象的引用,不会抛出错误。$obj->{$prop}表示$obj
正在尝试访问变量$prop
中存在名称的属性。我将用一个例子来解释
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;
}
}
在上面的代码中,$prop
包含值“X”,因此将调用函数X,同样,如果函数X包含值“Y”或“Z”,将调用它们。因此,函数的调用可以在运行时根据变量包含的值来决定
对于
$prop
为null的情况,没有对象被访问,因此返回对象的引用,不会抛出错误。这是访问对象属性时使用的首选语法。但在本例中,不需要括号。其主要目的是避免歧义:
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};
后者是不明确的,因为PHP可能会将语句的意思理解为“将$access
转换为其字符串值(即数组),使用该名称访问属性,并从该值获取索引key
”,也可能意味着使用在$access['key']
下找到的名称访问属性
无论哪种方式,这都是有用的,因为您的代码做得太过分了。您这样调用方法不是一个好主意。一个有效的用例可能是在处理JSON编码的数据或解析的XML DOM时,其中有数字键,或像
foo bar
这样的键,您不能写入:
$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
对于这些情况,使用变量表示法:
$obj->123;
$obj->foo-bar;//- is invalid
这是访问对象属性时使用的首选语法。但在本例中,不需要括号。其主要目的是避免歧义:
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};
后者是不明确的,因为PHP可能会将语句的意思理解为“将$access
转换为其字符串值(即数组),使用该名称访问属性,并从该值获取索引key
”,也可能意味着使用在$access['key']
下找到的名称访问属性
无论哪种方式,这都是有用的,因为您的代码做得太过分了。您这样调用方法不是一个好主意。一个有效的用例可能是在处理JSON编码的数据或解析的XML DOM时,其中有数字键,或像
foo bar
这样的键,您不能写入:
$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
对于这些情况,使用变量表示法:
$obj->123;
$obj->foo-bar;//- is invalid
这是访问对象属性时使用的首选语法。但在本例中,不需要括号。其主要目的是避免歧义:
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};
后者是不明确的,因为PHP可能会将语句的意思理解为“将$access
转换为其字符串值(即数组),使用该名称访问属性,并从该值获取索引key
”,也可能意味着使用在$access['key']
下找到的名称访问属性
无论哪种方式,这都是有用的,因为您的代码做得太过分了。您这样调用方法不是一个好主意。一个有效的用例可能是在处理JSON编码的数据或解析的XML DOM时,其中有数字键,或像
foo bar
这样的键,您不能写入:
$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
对于这些情况,使用变量表示法:
$obj->123;
$obj->foo-bar;//- is invalid
这是访问对象属性时使用的首选语法。但在本例中,不需要括号。其主要目的是避免歧义:
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};
后者是不明确的,因为PHP可能会将语句的意思理解为“将$access
转换为其字符串值(即数组),使用该名称访问属性,并从该值获取索引key
”,也可能意味着使用在$access['key']
下找到的名称访问属性
无论哪种方式,这都是有用的,因为您的代码做得太过分了。您这样调用方法不是一个好主意。一个有效的用例可以是处理JSON编码的数据时,或者