gpt4 book ai didi

php - 当父级公开时,如何将子构造函数设为私有(private)?

转载 作者:可可西里 更新时间:2023-11-01 00:39:06 25 4
gpt4 key购买 nike

为什么不能在子类中隐藏构造函数?

我收到以下异常:

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

父类(super class)代码(来自外部库):

    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 - 当父级公开时,如何将子构造函数设为私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53869888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com