有关PHP OOP的更多信息 - 类中的类

时间:2012-11-20 11:08:18

标签: php oop variables callback scope

我被告知在PHP中的类中无法定义类。然而,在我自己的例子中,这似乎让我感到困惑:

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

2 个答案:

答案 0 :(得分:3)

您可以在函数中声明一个类。这就是所谓的条件声明,即只有在调用该函数时才会声明该类。那么你是include一个带有类声明的文件,或者你是否在函数内输入代码,这并没有什么区别。

但这并不意味着类共享任何类型的范围或数据。只有声明是有条件嵌套的,它仍然具有与explained before相同的功能和范围。

你对回调的困惑可以解释同样的事情。第一次执行class_1::function_1时,正在定义function callback_function。这是一个可以从任何地方调用的常规全局函数。它不以任何方式绑定到班级。您还会注意到,您无法再次执行class_1::function_1,当您尝试再次声明时,PHP会抱怨callback_function已经存在。

至于源代码//How do I declare this variable so that it is available where I need it?中的评论:你没有。该变量是函数内的局部变量。它只在函数范围内。如果您愿意,您可以像使用任何其他返回值一样return其值。 (你可以把它global,但是对于上帝的爱不要!)如果你需要其他地方的值,不要将它声明为函数内的变量,因为只有函数可以访问它。

答案 1 :(得分: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;