PHP对象属性

PHP对象属性,php,properties,Php,Properties,我是PHP中OOP的新手,我发现下面两个表达式之间的差异很难理解 $object->$foo; $object->foo; 可能是我的错,但我在手册中找不到相关部分。第一次调用$obj->$foo使用了一个所谓的变量。选中此项: class A { public $foo = 1; } $a = new A(); $foo = 'foo'; // now you can use both echo $a->$foo; echo $a->fo

我是PHP中OOP的新手,我发现下面两个表达式之间的差异很难理解

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

可能是我的错,但我在手册中找不到相关部分。

第一次调用
$obj->$foo
使用了一个所谓的变量。选中此项:

class A { 
    public $foo = 1;
}

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

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

按照关于

的手册进行操作。为了完全理解有点奇怪的
$object->$foo
,您应该了解PHP的两个方面:

变量名 PHP中的大多数时间变量都非常简单。它们以一个
$
符号开头,有一个
[a-zA-Z_]
字符,然后是任意数量的
[a-Z-a-Z0-9_]
字符。例子包括:

$var  = 'Abcdef';
$_GET = [];
$a1   = 123;
// And so on...
现在,PHP变量实际上可以被命名为几乎任何东西,只要名称是,或者可以被转换为。使用任意名称命名变量的方法是使用大括号(
{}
),如下所示:

${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
至于这个问题 在这个问题中,
$object->$foo
基本上只是一个“对象变量”,如果你愿意的话

$object = new stdClass;
$object->abc = 'The alphabet!';

$foo = 'abc';
echo $object->$foo;
echo $object->{$foo};  // The same
echo $object->{'abc'}; // The same

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

它是
类名::$foo
用于访问静态属性,而
$object->foo
用于访问对象members@RoyalBg对的但是OP把
$
符号放在哪里弄糊涂了。@RoyalBg谢谢你提供了关于静态属性的额外信息。很好,很好+1谢谢:)我必须承认,我的第一个星期天早上的表情也告诉我第一行是错的;)非常感谢你的帮助!回答得好!谢谢你谢谢你扩展视野。非常有用。
$object = new stdClass;
$object->abc = 'The alphabet!';

$foo = 'abc';
echo $object->$foo;
echo $object->{$foo};  // The same
echo $object->{'abc'}; // The same