2012-11-16 35 views
0

在爲認證工作時,我遇到了一個MCQ問題。它如下。PHP 4:無法理解OOP行爲

問:請考慮以下腳本。它會輸出什麼?

<?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中對應的 值也會發生變化。不幸的是,新運算符不返回引用 ,而是返回新創建的對象的副本。因此,該腳本將輸出5和正確 答案是A.


雅我同意的描述是不夠好,但還是我不能夠消化它,因爲我們已經清楚地分配$global_obj $的參考那麼這怎麼可能是這樣呢?任何人都可以詳細解釋一下嗎?

+0

您正在爲* PHP 4 *認證練習......? :) – deceze

+0

爲什麼你想要獲得PHP 4認證?當我們現在使用PHP 5.4時,似乎浪費時間和金錢。 –

+0

我想這在印度仍然有用,他們在現有項目中獲得了很多外包維護工作(我曾在班加羅爾爲一家IT公司工作過兩年)。 –

回答

6

我們已經明確指定$ global_obj作爲$ this的引用,那麼這怎麼可能呢?

您在的構造函數中分配全局變量。那時候,你正在引用一種臨時對象。然後構造函數返回該臨時對象的副本。這是$ a將引用的副本(而全局變量仍然引用臨時對象)。

使用php 4進行​​OOP是瘋了。我想你不應該理解PHP 4的OOP行爲,只是接受它...

+0

謝謝Marvin,考試準備堅持理解PHP 4 OOP的行爲。反過來,實際上了解OOP的PHP 4和PHP 5之間的區別。「臨時對象」這個詞在這裏是有用的。其實我很困惑。謝謝。 –