PHP对象属性

时间:2014-02-16 09:53:43

标签: php properties

我是PHP的OOP新手,我发现以下两个表达式之间的区别很难理解。

    $object->$foo;
    $object->foo;

也许这是我的错,但我找不到手册中的相关部分。

2 个答案:

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

按照有关variable variables

的手册进行操作

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

对象变量变量可能有些用处,但很少需要它们。使用关联数组通常是更好的选择。