抽象类中的多个构造函数

时间:2018-11-03 22:30:51

标签: php constructor abstract-class

我有一个抽象类(为演示简化):

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中的抽象类提供替代构造函数?

2 个答案:

答案 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,以访问传递的变量列表。

第三种方式:您可以使用简单的数组传递任意数量的设置。