加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – __construct的可见性

发布时间:2020-12-13 21:45:59 所属栏目:PHP教程 来源:网络整理
导读:如果我有: abstract class AbstractSingleton{ protected static $instance; public static function getInstance() { if(null === static::$instance) static::$instance = new static(); return static::$instance; } protected function __construct() {
如果我有:

abstract class AbstractSingleton
{
    protected static $instance;

    public static function & getInstance()
    {
        if(null === static::$instance) static::$instance = new static();
        return static::$instance;
    }

    protected function __construct() { }
}

扩展该类的用户是否可以重新定义__construct的可见性?

class Singleton extends AbstractSingleton
{
    public function __construct() { } // That would be a problem
}

第二个问题,如果在AbstractSingleton中__construct被定义为私有,那么子类会发生什么?根本没有构造函数吗?是否为类提供了新的默认构造函数,如果是,则具有什么可见性?

解决方法

好吧,对于初学者,您不需要从方法中返回引用(&).从PHP 5开始,默认情况下通过引用传递和返回对象.

对于您的实际问题,要让孩子访问父母的成员,其访问修饰符至少需要受到保护.这对构造函数也很重要.因此,在您的情况下,子类将能够:

abstract class AbstractSingleton
{
    protected __ construct() {}
}

class Singleton extends AbstractSingleton
{
    public __construct()
    {
        parent::__construct();

        // more code
    }
}

解决这个问题的方法是使用final关键字.见:PHP documentation.

对于您的第二个问题,如果您将AbstractSingleton的构造函数设为私有并尝试在其子项上调用一个,则将使用默认的公共构造函数,就像使用它一样.

编辑:尽管如此,Singletons几乎不是一个好主意,特别是在PHP中.有可能,您只需利用自动通过引用传递/返回的PHP对象来解决您的问题.如果没有,依赖注入是一个更加友好的OOP替代方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读