PHP对象属性

3

我刚接触PHP中的面向对象编程,发现以下两个表达式之间的区别很难理解。

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

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

访问静态属性使用 ClassName::$foo,访问对象成员使用 $object->foo - Royal Bg
@RoyalBg,正确。但是OP对于在哪里放置“$”符号感到困惑。 - Shankar Narayana Damodaran
@RoyalBg 感谢您提供有关静态属性的额外信息。 - martjahu
2个回答

2

第一个调用$obj->$foo使用了所谓的变量变量。查看这个:

class A { 
    public $foo = 1;
}

$a = new A();
$foo = 'foo';

// now you can use both
echo $a->$foo;
echo $a->foo;

请遵循关于变量变量的手册


不错,hek,完美。**+1** - Shankar Narayana Damodaran
1
谢谢 :) 我必须承认,我的第一次周日早晨的看法也告诉我第一行是错误的 ;) - hek2mgl
非常感谢您的帮助! - martjahu
很好的回答!谢谢。 - Chethan N

2

好的,为了完全理解看起来有些奇怪的$object->$foo,您需要了解 PHP 的两件事:

变量名

大多数情况下,PHP 中的变量非常直观。它们以一个 $ 符号开头,后面跟一个 [a-zA-Z_] 字符,然后是任意数量的 [a-z-A-Z0-9_] 字符。例如:

$var  = 'Abcdef';
$_GET = [];
$a1   = 123;
// And so on...

现在,PHP变量实际上可以被命名为几乎任何东西,只要名称是标量类型或可以转换为标量类型即可。使用花括号({})来命名变量的方式如下所示:scalar type
${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

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

感谢您扩展视图,非常有用。 - martjahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接