1

在练习认证时,我遇到了一个 MCQ 问题。如下所示。

问:考虑以下脚本。它会输出什么?

<?php
$global_obj = null;
class my_class
{
   var $value;
   function my_class()
   {
      global $global_obj;
      $global_obj = &$this;
   }
}
$a = new my_class;
$a->my_value = 5;
$global_obj->my_value = 10;
echo $a->my_value;
?>

选择正确的一个 选项:

  • A. 5
  • B. 10
  • C、没有
  • D.构造函数会抛出错误
  • E. 510

我选择 B: 10 是因为在my_class构造函数$global_obj中是由$this. 当我交叉检查时,我的答案是错误的

作为描述,他们提到

这是一个非常棘手的问题。乍一看,似乎 的构造函数将对 my_class自身的引用存储在$global_obj variable. 因此,可以预期,当我们稍后将 的值更改$global_obj->my_value为 10 时,$a 中的相应值也会发生变化。不幸的是,new 运算符不返回引用,而是新创建对象的副本。因此,脚本将输出 5,正确答案为 A。


是的,我同意描述已经足够好了,但我仍然无法消化它,因为我们已经明确指定$global_obj了 $this 的引用,那么这怎么可能呢?谁能详细解释一下?

4

2 回答 2

6

我们已经明确为 $global_obj 分配了 $this 的引用,那么这怎么可能呢?

您在构造函数中分配全局变量。那时,您正在引用一种临时对象。然后构造函数返回该临时对象的副本。这是 $a 将引用的副本(而全局 var 仍然引用临时对象)。

使用 php 4 进行 OOP 是疯狂的。我猜你不应该理解 PHP 4 的 OOP 行为,而只是接受它......

于 2012-11-16T17:47:09.637 回答
0

此脚本将输出“5”,即 A 以及以下警告警告:从空值创建默认对象

原因是当你设置这个

                 `$global_obj = &$this;`

您的分配是对当前对象的引用

这篇文章可能会有所帮助

http://www.webmaster-source.com/2010/02/25/why-do-some-php-variables-have-an-ampersand-before-them/

于 2012-11-16T18:19:24.913 回答