为什么不能在子类中隐藏构造函数?
我得到以下异常:
致命错误:对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 Factory,Service Locator,Dependency 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;
}
}