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替代方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |