可以说我有一个名为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语句吗?
答案 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;
}
}