gpt4 book ai didi

php - 如何对 "private"构造函数进行异常处理?

转载 作者:行者123 更新时间:2023-12-04 14:19:54 25 4
gpt4 key购买 nike

我想声明一个非公共(public)构造函数,这样类的用户就不能直接调用 new Message(),而是必须从在抽象类上声明的静态构建器方法实例化对象Message 扩展。

到目前为止我的代码是:

abstract class SqlDecodable  {
public function instanceFromRawSql (array $rawSql) {
$newInstanceToReturn = new static() // problem is here
// .. map the new instance ..
return $newInstance ;
}

}

// for exemple...
class Message extends SqlDecodable {
private $receiverId ;
private $senderId ;
private $text ;

private/protected/public?? function __construct() {
// problem here : this constructor should be usable only by
parent class, not for user of Message
}
static function propertiesToSqlFields() {
return [
"receiverId" => "receiver_id_field_in_db",
"senderId" => "sender_id",
"text" => "text"
]
}
}

这个其实比较复杂,不过我简化了这道题的系统

当我实现我的方法 instanceFromRawSqlArray 时,我必须创建子类的一个新实例:$instanceToReturn = new static(),并通过一个之后。

不过,我不想在我的模型类中使用不带参数的 __construct。我不希望 Message 的开发用户能够 new Message()

此构造函数只能由 instanceFromRawSqlArray 使用。问题是,如我所见,PHP 中没有 C++ 友元类。我不能让我的 __construct protected ,因为正如我所见, protected 方法可供 child 访问,而不是供 parent 访问。

您是否有想法在方法 instanceFromRawSqlArray 中映射这个新实例,而不创建任何会破坏我的模型类“封装保护”的构造函数或 setter ?

最佳答案

你们很亲密。您可以简单地将构造函数声明为 protected

直接实例化该类是行不通的,但您可以从抽象类中声明的静态方法调用new

例如:

abstract class SuperAbstract {

static function create() {
return new static();
}
}

class Extended extends SuperAbstract {

private $hello = '';

protected function __construct() {
$this->hello = "world";
}

public function hello() {
return "hello " . $this->hello;
}
}

// works
$a = Extended::create();

echo $a->hello(); // outputs "hello world"

// can't touch this. This will fail because the constructor is `protected`.
$b = new Extended();

当然,因为它是 protected 构造函数也可以从子类中调用。这是不可避免的,只要 child 类是可能的。但是您也可以将 Extended 声明为 final,从而使类的扩展成为不可能。因此,只能从抽象父级中定义的工厂方法创建新实例。

final Extended extends SuperAbstract

protected function __construct() { }
}

您可以在此处看到它的工作(和失败):https://3v4l.org/LliKj

关于php - 如何对 "private"构造函数进行异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56199663/

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