为什么不能在子类中隐藏构造函数?
我得到以下异常:
致命错误:对cis\logger\wplogger的访问级别::uu construct()必须
在中公开(如在katzgrau\klogger\logger类中)
/构建/r2o/website/wp content/mu plugins/toolsets/lib/cis logger/src/wplogger.php
在线12
超类代码(来自外部库):

    public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array()) { // ...
    }

wplogger.php的代码(子类):
private function __construct(string $logDirectory, string $logLevelThreshold = LogLevel::DEBUG, array $options = array()) {
    parent::__construct($logDirectory, $logLevelThreshold, $options);
         // ... some actions
    }
}

public static function getInstance(string $logFileRelative = self::DEFAULT_LOG_NAME, string $logLevelThreshold = LogLevel::DEBUG, array $options = array()) {
       // ...
}

我不想用new实例化这个特殊的子类。出于某些原因,我希望它是用getInstance()静态创建的。我怎样才能做到这一点呢?

最佳答案

可以使用继承来扩展方法可见性。下面的例子是正确的

class A
{
   private function __construct()
   {}
}

class B extends A
{

   public function __construct()
   {}
}

但是您不能限制方法在儿童类中的可见性。以下示例不正确
class A
{
   public function __construct()
   {}
}

class B extends A
{
   private function __construct()
   {}
}

在您的例子中,您试图隐藏构造函数,因为您想使单例。在很多情况下,单身是不好的习惯。你应该用
其他对象构建模式:Static FactoryService LocatorDependency Injection Container
例如,您可以通过静态工厂的简单修改来存档必要的结果:
class LoggerFactory
{
    private static $instance = null;

    public static function build()
    {
        if (is_null(static::$instance)) {
            static::$instance = // making of the logger
        }
        return static:$instance;
    }
}

10-04 10:17