抽象父母使用孩子的别名

时间:2018-08-02 02:46:00

标签: php inheritance namespaces

是否可以在子级中为类创建别名,并在其继承的抽象类中使用该别名。

请参见下面的代码作为示例。

使用Model类的抽象类:

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;

abstract class ResourceController extends Controller
{
    public function index()
    {
        $model = Model::all();

        return view('backend.pages.'.$this->name.'.index', [
            'models' => $model
        ]);
    }

?>

孩子:

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Requests\Review as Request;
use App\Models\Review as Model;

class ReviewsController extends ResourceController
{
    protected $name = 'reviews';
}

?>

最终,我的意图是让一个ResourceController的方法对其子类的方法不了解,以便我可以继承它,并简单地别名要使用的Model和Request。

我仔细阅读了文档,但在我认为应该有办法做到这一点之后却找不到我的名字,但我必须忽略了一些东西。

1 个答案:

答案 0 :(得分:1)

简而言之:不。别名是具有定义范围的文字,如果它们的含义不是文字和不可预测的,那就太疯狂了。

基本上,这就是为什么您不使用static类方法,而是使用实例的原因。如果您要编写$this->model->all(),这将是很简单的,很明显,子类如何可以覆盖该行为。

使用静态类可以做的最好的事情是:

abstract class ResourceController extends Controller {
    abstract function getModelClass();

    public function index() {
        $class = $this->getModelClass();
        $model = $class::all();
    }
}

class ReviewsController extends ResourceController {
    function getModelClass() {
        return Model::class;
    }
}

但是再说一次,您应该给自己更大的灵活性,而应该这样做:

abstract class ResourceController extends Controller {
    abstract function getAll();

    public function index() {
        $model = $this->getAll();
    }
}