扩展PHP静态类

tre*_*nik 19 php oop class extending

我已经在这个领域挣扎了几天,我已经得出结论,但由于结论不是我想要的,在我放弃之前,我会试着看看其他人说的话.信仰最后死了......

假设我们有一个超类(称为"超级")和一个子类(称为"Sub").

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo self::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';
}
Run Code Online (Sandbox Code Playgroud)

现在,你可能会期望Sub扩展Super,Sub现在将继承所有Super的方法,但是,它似乎只接收Sub的方法的引用.

我这样说是因为如果我打电话:

Sub::get_class_name();
Run Code Online (Sandbox Code Playgroud)

输出是"超级",而不是"子".

如果我打电话:

Sub::get_title();
Run Code Online (Sandbox Code Playgroud)

再次,输出是"超级",我甚至在Sub中声明了$ title.

所以这意味着当我调用一个继承的静态函数时,函数的作用域将是超类,而不是被调用的函数(即使你打印了回溯,它也会显示调用是在超类上进行的),并且为了获得作为调用的子类的范围,我需要在该子类内重新声明该方法.那么这种失败的目的是延伸课程,不是吗?

所以我的问题是,我可以扩展一个静态类,调用一个继承的方法并具有子类的范围吗?或者至少能够识别它的类名?如果没有,我为什么要扩展静态类?

谢谢!

And*_*ore 31

同样,在PHP 5.3.0之前,这是不可能的.

在PHP 5.3.0中引入了 Late Static Binding,允许您通过static关键字完成所需的操作.

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo static::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';
}
Run Code Online (Sandbox Code Playgroud)

get_class_name()仍将返回Super虽然__CLASS__总是返回正在运行的方法声明的当前类(类似于__FILE__总是返回当前文件,无论你是否包含它).

为此,你没有Sub别的选择,只能在课堂上重新声明这个功能.

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo static::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';

    public static function get_class_name()        
    {
        echo __CLASS__;
    }
}
Run Code Online (Sandbox Code Playgroud)