Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 抽象父对象使用子对象';s别名_Php_Inheritance_Namespaces - Fatal编程技术网

Php 抽象父对象使用子对象';s别名

Php 抽象父对象使用子对象';s别名,php,inheritance,namespaces,Php,Inheritance,Namespaces,是否可以在子类中为类别名,并在其继承的抽象类中使用该别名 请参见下面的代码作为示例 使用模型的抽象类类: <?php namespace App\Http\Controllers\Backend; use App\Http\Controllers\Controller; abstract class ResourceController extends Controller { public function index() { $model = Mo

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

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

使用
模型的抽象类
类:

<?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
,其方法对其子类的方法视而不见,这样我就可以继承它,并简单地别名使用哪个模型和请求


我仔细阅读了文档,在我认为应该有办法做到这一点之后,我找不到我是什么,但我一定忽略了什么。

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

这就是为什么不使用
静态
类方法,而是使用实例的基本原因。如果您编写
$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();
    }
}