PHP:改进扩展机制以遵循规则?

时间:2018-08-01 07:09:18

标签: php

可以说我有一个名为Controller的类,该类被控制器类使用。

<?php declare(strict_types = 1);

namespace App\Controllers;

class Controller {

}

我有几个这样的类,想象它们在单独的文件中。

<?php declare(strict_types = 1);

namespace App\Controllers\Frontend;

use App\Controllers\Controller;
use App\Providers\Template;
use App\Providers\Configuration;

class LandingController extends Controller {

    private $template;

    public function __construct(Template $template, Configuration $config) {
        $this->template = $template;
    }
}

class SomeOtherController extends Controller {

    private $template;

    public function __construct(Template $template, Configuration $config) {
        $this->template = $template;
    }
}

现在,所有这些类都是控制器。它们总是通过构造函数传递相同的参数,并且都具有相同的use语句。有什么方法可以迫使它遵守这些规则?

我真的需要在每个控制器文件中包含所有3个use语句吗?

1 个答案:

答案 0 :(得分:3)

这些use语句通过将这些类移到当前名称空间的可访问方式中,而不必使用完整路径,从而帮助您保持代码干净。

这是没有use语句的样子。

namespace App\Controllers\Frontend;
class SomeOtherController extends \App\Controllers\Controller {

    private $template;

    public function __construct(\App\Providers\Template $template, \App\Providers\Configuration $config) {
        $this->template = $template;
    }
}

如果不需要编译时安全,则可以跳过use语句,而只使用变量名。

namespace App\Controllers\Frontend;
class SomeOtherController extends \App\Controllers\Controller 
{

    private $template;

    public function __construct($template, $config) 
    {
        $this->template = $template;
    }
}

如果只希望编辑器自动完成,则还可以使用phpdoc注释。

namespace App\Controllers\Frontend;
class SomeOtherController extends \App\Controllers\Controller
{
    /**
     * @var $template \App\Providers\Template
     */
    private $template;

    /**
     * @param $template \App\Providers\Template
     * @param $config \App\Providers\Configuration
     */
    public function __construct($template, $config) 
    {
        $this->template = $template;
    }
}

现在,如果您想使用use语句,则还可以使用类别名系统为自己创建短代码,从而省去了记住命名空间的麻烦。 在应用程序启动时,将其放在自动加载脚本之后即可。

class_alias('App\Controllers\Controller','Controller',true);
class_alias('App\Providers\Template','Template',true);
class_alias('App\Providers\Configuration','Configuration',true);

然后在您的控制器中可以执行以下操作:

namespace App\Controllers\Frontend;
use Controller;
use Template;
use Configuration;

class SomeOtherController extends Controller 
{

    private $template;

    public function __construct(Template $template, Configuration $config) 
    {
        $this->template = $template;
    }
}

我个人建议您继续使用use语句。它将帮助您以后(数月或数年)找到返回的路径,转到这些类中进行检查,并且将提供编译时安全性,防止在例如错误的类被传递时传递错误类型的流氓对象。在编辑器中选择“自动完成”,可帮助您快速发现错误。

此外,我建议将phpdoc注释添加到您的变量和方法中。当将鼠标悬停在其他代码的方法和变量上时,可以立即查看期望的类型,返回的内容以及它将执行的操作。

所以我的建议是增加更多而不是更少。

namespace App\Controllers\Frontend;
use App\Controllers\Controller;
use App\Providers\Template;
use App\Providers\Configuration;

/**
   * SomeOtherController
   * Handles other stuff than someController.
   * 
   * @package    App\Controllers\
   * @subpackage Frontend
   * @author     a5266680 <example@example.com>
   */
class SomeOtherController extends Controller 
{
    /**
     * @var $template \App\Providers\Template
     */
    private $template;

     /**
     * @var $configuation App\Providers\Configuration
     */
    private $configuation;

    /**
     * @param $template \App\Providers\Template
     * @param $configuation \App\Providers\Configuration
     */
    public function __construct(Template $template,Configuration $configuation) 
    {
        $this->template = $template;
        $this->configuration = $config;
    }
}