__construct 的可见性
Posted
技术标签:
【中文标题】__construct 的可见性【英文标题】:Visibility of __construct 【发布时间】:2012-11-22 14:26:44 【问题描述】:如果我有:
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
第二个问题,如果 __construct
在 AbstractSingleton 中定义为私有,子类会发生什么?根本就没有构造函数吗?是否为类提供了新的默认构造函数,如果是,具有什么可见性?
【问题讨论】:
又一个例子说明了为什么单身人士不值得麻烦...... 【参考方案1】:如果你使 __construct() final 那么子类不能覆盖这个方法。 http://php.net/manual/en/language.oop5.final.php
在 PHP 中,您可以在子类中向上修改级别(您可以从父类中的私有变为子类中的公共),但不能反向。
编辑 - 如果您将 __construct() 设为私有而不是在该类内部以外的任何地方,您可以执行new Class()
。
【讨论】:
好的,谢谢!如果我将其设为私有,子类会发生什么? @Virus721 除了在 AbstractSingleton 内部之外,您将无法调用 new Singleton【参考方案2】:好吧,对于初学者来说,您不需要从您的方法中返回引用 (&
)。自 PHP 5 起,对象默认通过引用传递和返回。
对于您的实际问题,要让孩子访问父母的成员,其访问修饰符至少需要受到保护。这对构造函数也很重要。因此,在您的情况下,子类可以做到:
abstract class AbstractSingleton
protected __ construct()
class Singleton extends AbstractSingleton
public __construct()
parent::__construct();
// more code
解决这个问题的方法是使用final
关键字。请参阅:PHP documentation。
对于您的第二个问题,如果您将 AbstractSingleton 的构造函数设为私有并尝试在其子级上调用一个,那么将使用默认的公共构造函数,就像往常一样。
编辑:话虽如此,单例几乎不是一个好主意,尤其是在 PHP 中。很有可能,您只需利用通过引用自动传递/返回的 PHP 对象即可解决您的问题。如果不是,依赖注入是一种对 OOP 更友好的替代方案。
【讨论】:
以上是关于__construct 的可见性的主要内容,如果未能解决你的问题,请参考以下文章
Juc12_Volatile的可见性不保证可见性有序性使用内存屏障四大指令StoreStoreStoreLoad LoadLoadLoadStore