当我扩展一个类时,我是直接从子类型调用静态函数还是每次都使用parent ::?

时间:2011-11-17 13:48:20

标签: php oop inheritance supertype

当我在超类型中定义一个函数并且在没有父类的情况下调用时,它给了我并且错误地告诉我它是未定义的函数。我想知道我是否应该每次使用parent ::或者我在其他地方做错了什么。

我有一个名为core的类,它有一个转义字符串的escape()函数 我试图从子类型调用此函数。 所有方法都是静态的。

现在我不认为静态方法是继承的。我用

调用所有静态超类方法
parent::mystaticmethod() 

现在。因为静态方法不是继承的。

1 个答案:

答案 0 :(得分:4)

只有在您的子课程中覆盖功能时才使用parent::

最好的解释方法就是这个例子:

class Parent {
    function test1() {}    
    function test2() {}
    function __construct() {}
}

class Child extends Parent {
    function test1() {}  // function is overrided
    function test3() {
        parent::test1(); // will use Parent::test1()
        $this->test1();  // will use Child::test1()
        $this->test2();  // will use Parent:test2()
    }
    function __construct() {
        parent::__construct() // common use of parent::
        ... your code.
    }
}

实际例子(静态方法):

class LoaderBase {
    static function Load($file) {
        echo "loaded $file!<br>";
    }
}

class RequireLoader extends LoaderBase {
    static function Load($file) {
        parent::Load($file);
        require($file);
    }
}

class IncludeLoader extends LoaderBase {
    static function Load($file) {
        parent::Load($file);
        include($file);
    }
}

LoaderBase::Load('common.php'); // this will only echo text
RequireLoader::Load('common.php'); // this will require()
IncludeLoader::Load('common.php'); // this will include()

Output:
loaded common.php!
loaded common.php!
loaded common.php!

无论如何使用parent ::在非静态方法中更有用。

从PHP 5.3.0开始,PHP实现了一个名为late static bindings的功能,可用于在静态继承的上下文中引用被调用的类。

此处提供更多信息http://php.net/manual/en/language.oop5.late-static-bindings.php