2

我被告知不能在 PHP 的类中定义一个类。但是,在我自己的示例中,这似乎使我感到困惑:

类测试.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

再次感谢大家。


注意:这是一个后续

4

2 回答 2

3

您可以在函数中声明一个类。这就是所谓的条件声明,即只有当函数被调用时,类才会被声明。include无论您是带有类声明的文件还是在函数内键入代码,这都没有太大区别。

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

您对回调的困惑可以用同一件事来解释。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,但看在上帝的份上,不要!)如果你在其他地方需要那个值,不要将它声明为函数内的变量,因为那时只有函数可以访问它。

于 2012-11-20T11:27:52.680 回答
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;
于 2012-11-20T11:13:44.707 回答