Ulteriori informazioni su PHP OOP – Classi all'interno delle classi

Mi è stato detto che una class non può essere definita all'interno di una class in PHP. Tuttavia, nel mio esempio questo sembra funzionare che mi ha confuso:

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); } } 

Caricamento di class_test.php printingto

 Hello World - A Callback 

Domanda : come posso definire $missing_variable tale da poterlo get where ne ho bisogno?


Nel caso in cui qualcuno in futuro abbia un problema simile, per quanto improbabile possa essere, voglio collegarmi al codepad dal basso che mostra la $ missing_variable echo'd al di fuori delle classi:

http://codepad.org/tRk0XWG7

Grazie ancora a tutti.


Nota : questo è un seguito .

$missing_variable in alcuni posti. Vedi sotto. (Questo non è l'unico modo per farlo, attenzione)

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; 

È ansible dichiarare una class all'interno di una function . Questo è noto come dichiarazione condizionale , cioè solo se la function è chiamata la class sarà dichiarata. Non fa molta differenza se si include un file con la dichiarazione di class o se si digita il codice all'interno della function.

Ciò non significa tuttavia che le classi condividano qualsiasi tipo di ambito o dati. Solo la dichiarazione è nidificata condizionalmente, ha ancora la stessa funzionalità e lo stesso ambito di spiegazioni precedenti .

La tua confusione sulla callback può essere spiegata dalla stessa cosa. Quando class_1::function_1 viene eseguito la prima volta, viene definita la function callback_function . Questa è una function globale regolare che può essere chiamata da qualsiasi luogo. Non è legato alla class in alcun modo. Noterai inoltre che non puoi eseguire class_1::function_1 una seconda volta, PHP si lamenterà che callback_function esiste già quando stai tentando di dichiararlo di nuovo.

Per quanto riguarda il commento nel codice sorgente //How do I declare this variable so that it is available where I need it? : Non lo fai. Quella variabile è una variabile locale all'interno di una function. È solo nell'ambito della function. È ansible return suo valore dalla function come qualsiasi altro valore di return, se lo si desidera. (Si potrebbe renderlo global , ma per l'amore di Dio no!) Se hai bisogno di quel valore da qualche altra parte, non dichiararlo come una variabile all'interno di una function, perché solo la function può accedervi allora.