考虑以下代码示例:
$m_oDate = new DateTime('2013-06-12 15:54:25');
some_func($m_oDate);
echo $m_oDate->{'ROXXOR_IS_BACK!!'};
与您最明显print_r
的区别是调用不同的函数而不是函数some_func
。期望可能会有所不同,因为您知道print_r
但您不知道some_func
,但这只是为了提高您的感官。让我们等一下,直到我显示该函数的定义。
第二个区别是正在回显的属性的名称。在这里我选择了一个非常特别的名字:{'ROXXOR_IS_BACK!!'}
,再次让你的感官更加敏锐。
这个名字太疯狂DateTime
了,尽管在上面的例子执行时,它显然不是它的一部分,但很明显这个 roxxor 属性必须存在。程序输出:
PHP never lets you down.
那怎么来?是的,您肯定已经知道它是如何工作的。该some_func()
功能必须添加它。那么让我们看一下函数定义:
function some_func($m_oDate) {
$m_oDate->{'ROXXOR_IS_BACK!!'} = 'PHP never lets you down.';
}
是的,现在可以清楚地看到这个函数已经向对象添加了一个属性。它还表明,使用 PHP 中的任何对象都可以轻松实现这一点。
与 PHP 中的数组相比,您还可以根据需要添加新键。
这个例子不是无中生有的,因为这是 PHP 中的对象的来源:它们只是数组周围的语法糖,这与 PHP 3 中引入 PHP 中的对象的时间有关:
在 PHP 3.0 的源代码树中引入类时,它们被添加为访问集合的语法糖。PHP 已经有了关联数组集合的概念,而新的小动物只不过是一种访问它们的简洁的新方法。然而,随着时间的推移,事实证明,这种新语法对 PHP 的影响比最初预期的要深远得多。
-- Zeev Suraski about the standard object since PHP 3 (archived copy) - via Why return object instead of array?
This is also the simple explanation why it's totally common in PHP that functions can add member variables which have not been defined earlier in the class. Those are always public.
So when you do assumptions about some object having a property or not, take a look where it comes from. It must not be part of the class but might have been added later.
And keep the following in mind:
Do not use print_r
and var_dump
in production code.