__construct函数未按预期工作

时间:2014-09-24 12:39:34

标签: php oop

我正在尝试为我的班级构建一个__construct函数。此函数应获取All $ _REQUEST值并将它们存储在一个数组中,以便稍后可以通过id调用它们。问题是它没有存储我的变量,我也不知道为什么。

看到这是我的第一个"认真的"尝试建构,这很可能是我的愚蠢。但是我想知道那是什么。

Class Regex {

private static $requests = array();

    function __construct() {
        foreach($_REQUEST as $key => $value) {
            self::$requests[$key] = array(
                'value' => $value,
                'status' => false,
                'errorList' => array()
            );
        }
    }



    public static function preg($key, $rules) {
        var_dump(self::$requests); // for test purpose
    }
}

上面的结果是:array (size=0) empty

4 个答案:

答案 0 :(得分:4)

你甚至在调用构造函数吗?只有在显式或通过new关键字)调用构造函数时才会调用构造函数。

PHP没有像Java这样的静态构造函数。

您必须确保在首次访问preg()方法时填充数组:

public static function preg($key, $rules) {
    if (empty(self::$requests)) {
        foreach($_REQUEST as $key => $value) {
            self::$requests[$key] = array(
                'value' => $value,
                'status' => false,
                'errorList' => array()
            );
         }
    }
    var_dump(self::$requests); // for test purpose
}

答案 1 :(得分:3)

在创建一个新的正则表达式对象时会调用Regex类的构造函数,如下所示:

$regex = new Regex;

但是你永远不会创建一个Regex对象,因此永远不会调用构造函数,从而产生一个空的$ requests数组。

答案 2 :(得分:2)

您使用静态功能。我认为你不会调用构造方法。如果您创建一个新实例,则会调用__construct函数。

$regex = new Regex;

如果调用静态类,例如Regex::preg,则不会调用构造函数。

答案 3 :(得分:-1)

扩展bwoebi的答案,你仍然可以通过从构造函数本身添加对静态函数preg的调用来获得预期的结果,如下所示:

尽管如此,这只会增加更多的膨胀而没有任何实际好处。

虽然在某些情况下这可能会有用,但我只在这个答案中添加它作为显示当前结构可以简单地添加两个简单线条的方法,我建议使用@ bwoebi&#39 ; s回答但要记住,虽然控制器本身不是静态的,但它不以任何方式或形式阻止它与静态方法通信。

PHP:

class Regex {

    private static $requests = array();

    function __construct(){
        if (empty(self::$requests)) {
            foreach($_REQUEST as $key => $value) {
                self::$requests[$key] = array(
                    'value' => $value,
                    'status' => false,
                    'errorList' => array()
                );
            }
        }
        self::preg();
    }

    public static function preg(){
        var_dump(self::$requests); // for test purpose
    }
}

$var = new Regex();