我是PHP的OOP新手,我发现以下两个表达式之间的区别很难理解。
$object->$foo;
$object->foo;
也许这是我的错,但我找不到手册中的相关部分。
答案 0 :(得分:2)
第一个调用$obj->$foo
正在使用所谓的变量变量。检查一下:
class A {
public $foo = 1;
}
$a = new A();
$foo = 'foo';
// now you can use both
echo $a->$foo;
echo $a->foo;
的手册进行操作
答案 1 :(得分:2)
好吧,为了完全理解有点奇怪的$object->$foo
,你应该理解关于PHP的两件事:
PHP中的大部分时间变量非常简单。它们以$
符号开头,有一个[a-zA-Z_]
个字符,然后是任意数量的[a-z-A-Z0-9_]
个字符。例子包括:
$var = 'Abcdef';
$_GET = [];
$a1 = 123;
// And so on...
现在,PHP变量实际上几乎可以命名为任何,只要名称是scalar type,或者可以强制转换为{{3}}。用任何东西命名变量的方法是使用花括号({}
),如下所示:
${null} = 'It works'; echo ${null};
${false} = 'It works'; echo ${false};
${'!'} = 'It works'; echo ${'!'};
// Slightly weirder...
${(int)trim(' 5 ')} = 'It works'; echo ${5};
${implode(['a','b','c'])} = 'It works'; echo $abc;
重要提示:仅仅因为你可以这样做并不意味着你应该这样做。你可以做到这一点,这只是一个奇怪的PHP。
一个有点复杂的解释:变量变量是使用变量名称访问的变量。
理解变量变量的一种更简单的方法是使用我们刚刚学习的PHP中的变量名称。举个例子:
${"abc"} = 'Abc...';
echo $abc;
我们使用字符串"abc"
创建变量,也可以使用$abc
访问该字符。
现在,没有理由(或规则)说它必须是一个字符串....它也可以是一个变量:
$abc = 'Abc...';
$varName = 'abc';
echo ${$varName}; // echo $abc
这基本上是一个变量变量。 “真正的”变量变量只是不使用花括号:
$abc = 'Abc...';
$varName = 'abc';
echo $$varName; // echo $abc
在问题中$object->$foo
事物基本上只是一个“对象变量变量”,如果你愿意的话
$object = new stdClass;
$object->abc = 'The alphabet!';
$foo = 'abc';
echo $object->$foo;
echo $object->{$foo}; // The same
echo $object->{'abc'}; // The same
对象变量变量可能有些用处,但很少需要它们。使用关联数组通常是更好的选择。