我有一个抽象类(为演示简化):
abstract class MyClass {
protected $id = "";
protected $title = "";
function __construct($title) {
$this->id = strtolower($title);
$this->titulo = $title;
}
abstract function render();
}
我想添加第二个构造函数,该构造函数不仅传递标题,还传递ID,但是PHP似乎没有方法重载。在网上搜索时,我发现a post on Stack Overflow在这里建议创建一个静态方法,该方法将创建并返回同一对象的实例,并用作替代构造函数。像这样:
static function create($id, $title) {
$instance = new self($title);
$this->id = $id;
return $instance;
}
在 regular 类中可以正常工作,但不适用于上面的抽象类。例如,当执行类似$myclass = MyClass::create("id", "title");
的操作时,我收到错误消息:
异常:无法实例化抽象类MiClase
发生在$instance = new self($title);
行中,并且在尝试实例化属于抽象类的自己的类时是有意义的。
是否可以为PHP中的抽象类提供替代构造函数?
答案 0 :(得分:1)
这是一种小方法:
<?php
abstract class MyClass {
protected $id = "";
protected $title = "";
function __construct($title) {
$this->id = strtolower($title);
$this->title = $title;
}
static function createWithTitle($title) {
$instance = new static($title);
return $instance;
}
static function createWithIdAndTitle($id, $title) {
$instance = new static($title);
$instance->id = $id;
return $instance;
}
abstract function render();
}
class Concrete extends MyClass {
function render() {
var_dump('id=' . $this->id, 'title=' . $this->title);
}
}
Concrete::createWithTitle('Title')->render();
Concrete::createWithIdAndTitle(1, 'Title')->render();
请注意,此处的static
关键字非常重要,而不是self
参见Late Static Bindings
答案 1 :(得分:1)
<?php
abstract class MyClass
{
protected $id = '';
protected $title = '';
public function __construct(...$array)
{
switch (count($array))
{
case 2: $this->title = $array[1];
case 1: $this->id = $array[0]; break;
}
}
}
第二种方式(对于较早的PHP版本):您可以在函数(方法)主体内用...$array
替换func_get_args
,以访问传递的变量列表。
第三种方式:您可以使用简单的数组传递任意数量的设置。