__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 的可见性的主要内容,如果未能解决你的问题,请参考以下文章

如何基于POPUP可见性javascript执行代码

Juc12_Volatile的可见性不保证可见性有序性使用内存屏障四大指令StoreStoreStoreLoad LoadLoadLoadStore

符号可见性和 gcc 警告

使用可见性属性(没有 __declspec(dllexport))时,Clang 可以生成导入库吗?

具有隐藏可见性的 C++ 模板参数问题

php获取可见性