2012-11-20 89 views
2

我被告知無法在PHP中的類中定義一個類。然而,在我自己的例子,這似乎工作已經我困惑:關於PHP OOP的更多信息 - 類內的類

class_test.php:

require('class_1.php'); 
new class_1 
//Need $missing_variable here. 

class_1.php

class class_1{ 
    public function function_1(){ 
     function callback_function(){ 
      echo "A Callback"; 
      $missing_variable = "Where Did I Go?"; 
     } 
     require('class_2.php'); 
     new class_2('callback_function'); 
    } 
    public function __construct(){ 
     $this->function_1(); 
    } 
} 

class_2.php

class class_2{ 
    public function __construct($callback){ 
     echo "Hello World - "; 
     call_user_func($callback); 
    } 
} 

加載class_test.php打印出

Hello World - A Callback 

問題:如何定義$missing_variable,這樣我可以得到它,我需要它?


在未來的情況下,任何人也有類似的問題,但是不太可能,我想從鏈接到鍵盤下方,顯示從課後回顯的$ missing_variable:

http://codepad.org/tRk0XWG7

再次感謝大家。


:這是一個follow up

+0

一個函數是'需要在類中的另一個類......這是你的困惑的來源? – irrelephant

+0

的確如此......但令我困惑的是,它不僅僅需要另一個類,它還需要另一個類,它使用自身的函數作爲第二個類中的回調函數.....我很困惑自己:(代碼在那裏...... –

+0

原來我的主要誤解是,當你定義一個類或函數時,它存在於該範圍內,原來它是有條件的(只有在調用容器時才定義),但我自己對OOP有了更好的理解,謝謝大家!我在這裏選擇Kavi Siegel作爲編解碼器,並在另一個問題上解釋了一些很好的解釋,再次感謝! –

回答

1

你會在幾個地方返回$missing_variable。見下文。 (這是不這樣做的唯一途徑,請注意)

http://codepad.org/tf08Vgdx

<? 
class class_2{ 
    public function __construct($callback){ 
     echo "Hello World - "; 
     $missing = $callback(); 
     $this->missing = $missing; 
    } 
} 
class class_1{ 
    public function function_1(){ 
     function callback_function(){ 
      echo "A Callback. "; 
      $missing_variable = "Where Did I Go?"; 
      return $missing_variable; 
     } 
     $class2 = new class_2('callback_function'); 
     return $class2->missing; 
    } 
    public function __construct(){ 
     $this->missing = $this->function_1(); 
    } 
} 

$class = new class_1(); 

echo $class->missing; 
+0

我看到......如果我需要第一個類中的第二個類(我需要嵌套它們,因爲我需要動態類需要它們),那麼如何在兩個類之外獲得變量?同樣重要的是要注意回調函數存在於class_1中併發送到class_2。 –

+1

如果一個函數(在一個類中或者沒有)返回一個值,你可以在變量的函數(或類)之外捕獲它:'$ variable = $ class-> missing; echo $ variable;'取自上面的代碼 – Dale

+0

我很抱歉,我相信你在解釋它的奇妙之處,但我在這裏有一個金髮的時刻......... http://codepad.org/OCfrNSsv 。 ?!? –

3

您可以將功能內聲明一個類。這就是所謂的條件聲明,即只有在函數被調用時纔會聲明該類。如果您使用類聲明的include文件,或者如果您在函數內輸入代碼,那麼它並沒有太大區別。

但這並不意味着這些類共享任何類型的作用域或數據。只有聲明是有條件嵌套的,它仍然具有與explained before相同的功能和範圍。

您對回調的困惑可以用同樣的方法解釋。當第一次執行class_1::function_1時,正在定義function callback_function。這是一個常規的全球功能,可以從任何地方調用。它不以任何方式與班級綁定。你還會注意到你不能再次執行class_1::function_1,PHP會抱怨已經存在,當你試圖再次聲明它時。

至於源代碼中的評論//How do I declare this variable so that it is available where I need it?:你沒有。該變量是函數內的局部變量。它只在函數的範圍內。你可以return它的值來自函數,如果你願意,可以像任何其他返回值一樣。 (你可以讓它變成global,但是對於上帝的愛不會!)如果你在別的地方需要這個值,不要在函數內聲明它是一個變量,因爲只有函數可以訪問它。

+0

啊!所以這些類不共享範圍......即它的工作方式與單獨聲明/事先聲明相同......實例化怎麼樣?如果我在函數/ first_class中實例化類,那麼這個新的類對象存在於first_class的範圍內,並進一步在函數中? –

+2

類實例,即* object *,只是一個值。這個對象被賦予的變量受所有其他變量的規則約束,正如我的其他答案中所解釋的。所以你有一個變量,它是一個類中的函數內的對象。 Whoopdidoo,就像你在類之外的函數外部有該變量一樣。 :) – deceze

+1

upvote爲Whoopdidoo – Dale