首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何扩展PHP静态类?

如何扩展PHP静态类?
EN

Stack Overflow用户
提问于 2018-01-09 06:49:59
回答 2查看 0关注 0票数 0

假设我们有一个超类(称为“Super”)和一个子类(称为“Sub”)。

代码语言:javascript
复制
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';
}

现在,因为Sub扩展了Super,Sub现在将继承Supers的所有方法,然而,只接收到对Sub方法的引用。

我这么说是因为如果我调用函数:

代码语言:javascript
复制
Sub::get_class_name();

输出是“super”,而不是“sub”。

如果我调用:

代码语言:javascript
复制
Sub::get_title();

同样,输出是“super”,我甚至在Sub中声明了$title。

所以我的问题是,我是否可以扩展静态类,调用继承的方法之一,并拥有子类的作用域?或者至少能识别出它的类名?如果没有,我为什么要扩展静态类?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-01-09 15:18:14

在PHP 5.3.0之前,这是不可能的。

后期静态绑定在PHP 5.3.0中引入,并允许你通过static关键词。

代码语言:javascript
复制
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';
}

get_class_name()还会回来Super虽然__CLASS__始终返回正在运行的方法在__FILE__它总是返回当前文件,不管是否包含它)。

为此,你别无选择,只能在Sub调用

代码语言:javascript
复制
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__;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-01-09 16:32:33

你可以用get_called_class()若要获取你正在调用的类的类名,即使它是静态的。你不必在任何地方声明。

例子:

代码语言:javascript
复制
class Super {
    public static function get_class1_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo get_called_class();
    }

}
class Sub extends Super {    
    public static function get_class2_name()        
    {
        echo __CLASS__;
    }

}
Sub::get_title(); // Echos Sub.
Sub::get_class1_Name(); // echos super
Sub::get_class2_Name(); // echos sub

因此,你不必声明任何变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档