如果我有:
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定义为私有,子类会发生什么?是不是根本没有构造器?是否为类提供了新的默认构造函数,如果是,具有什么可见性?
发布于 2012-12-05 05:08:00
首先,你不需要从你的方法返回一个引用(&)。从PHP 5开始,默认情况下对象是通过引用传递和返回的。
对于您的实际问题,对于要访问父级成员的子级,其访问修饰符至少需要受到保护。这也适用于构造函数。因此,在您的例子中,一个子类将能够:
abstract class AbstractSingleton
{
protected __ construct() {}
}
class Singleton extends AbstractSingleton
{
public __construct()
{
parent::__construct();
// more code
}
}解决这个问题的方法是使用final关键字。请参阅:PHP documentation
对于您的第二个问题,如果您将AbstractSingleton的构造函数设为私有,并尝试在其子级上调用一个构造函数,那么将使用默认的公共构造函数,就像往常一样。
编辑:话虽如此,单例并不是一个好主意,尤其是在PHP中。您可能只需利用PHP对象通过引用自动传递/返回的优势就可以解决问题。如果不是这样,依赖注入是一种对OOP更友好的选择。
发布于 2012-12-05 05:05:57
如果让__construct() final,那么子类就不能覆盖这个方法。http://php.net/manual/en/language.oop5.final.php
在PHP中,您可以在子类中向上修改级别(您可以从父类中的private修改为子类中的public ),但您不能反向修改。
编辑-如果您将__construct()设为私有,那么除了在该类内部之外的任何地方,您都可以执行new Class()。
https://stackoverflow.com/questions/13711764
复制相似问题