为什么不能在子类中隐藏构造函数?
我得到以下例外:
Fatal error: Access level to CIS\Logger\WPLogger::__construct() must
be public (as in class Katzgrau\KLogger\Logger) in
/builds/r2o/website/wp-content/mu-plugins/toolsets/lib/cis-logger/src/WPLogger.php
on line 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;
}
}
标签:php,class,oop,constructor,inheritance
来源: https://codeday.me/bug/20190827/1745554.html