首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__construct的可见性

__construct的可见性
EN

Stack Overflow用户
提问于 2012-12-05 04:56:15
回答 2查看 2.9K关注 0票数 3

如果我有:

代码语言:javascript
复制
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的可见性吗

代码语言:javascript
复制
class Singleton extends AbstractSingleton
{
    public function __construct() { } // That would be a problem
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-05 05:08:00

首先,你不需要从你的方法返回一个引用(&)。从PHP 5开始,默认情况下对象是通过引用传递和返回的。

对于您的实际问题,对于要访问父级成员的子级,其访问修饰符至少需要受到保护。这也适用于构造函数。因此,在您的例子中,一个子类将能够:

代码语言:javascript
复制
abstract class AbstractSingleton
{
    protected __ construct() {}
}

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

        // more code
    }
}

解决这个问题的方法是使用final关键字。请参阅:PHP documentation

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

编辑:话虽如此,单例并不是一个好主意,尤其是在PHP中。您可能只需利用PHP对象通过引用自动传递/返回的优势就可以解决问题。如果不是这样,依赖注入是一种对OOP更友好的选择。

票数 4
EN

Stack Overflow用户

发布于 2012-12-05 05:05:57

如果让__construct() final,那么子类就不能覆盖这个方法。http://php.net/manual/en/language.oop5.final.php

在PHP中,您可以在子类中向上修改级别(您可以从父类中的private修改为子类中的public ),但您不能反向修改。

编辑-如果您将__construct()设为私有,那么除了在该类内部之外的任何地方,您都可以执行new Class()

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

https://stackoverflow.com/questions/13711764

复制
相关文章

相似问题

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