2012-11-20 116 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