php - PHP 的“使用”关键字和自动加载
问题描述
我的问题分为三个部分:
放入
use
语句会立即触发自动加载器,还是等到使用该类?(延迟加载)如果自动加载不是以延迟加载方式完成的,那会对性能产生负面影响吗?
哪种模式最好遵循,为什么?
use
当未使用该语句时,PhpStorm 将“不必要的完全限定名称...”显示为代码问题。
下面是一个带有use
语句的 Laravel 控制器的示例类定义:
namespace App\Http\Controllers;
use Carbon\Carbon;
class FooController extends Controller
{
/**
* This action uses the Carbon class
*/
public function bar1()
{
return view('foo.bar1', ['now' => new Carbon()]);
}
/**
* This action does not use the Carbon class
*/
public function bar2()
{
return view('foo.bar2');
}
}
没有声明的同一个类use
:
namespace App\Http\Controllers;
class FooController extends Controller
{
/**
* This action uses the Carbon class
*/
public function bar1()
{
return view('foo.bar1', ['now' => new \Carbon\Carbon()]);
}
/**
* This action does not use the Carbon class
*/
public function bar2()
{
return view('foo.bar2');
}
}
解决方案
new Class()
1) 执行语句时会自动加载该类。
2) 见 1)
3) 最好遵循哪种模式,为什么?:
我建议您使用use
,因为您可能会遇到名称空间非常长并且您的代码将变得不可读的情况。
从php 文档:
此示例尝试分别从文件 MyClass1.php 和 MyClass2.php 加载类 MyClass1 和 MyClass2。
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
命名空间只是组织类的附加功能。
编辑:正如@IMSoP 在评论中指出的那样,新的并不是唯一一次触发自动加载器。访问类常量、静态方法或静态属性也会触发它,运行class_exists也会触发它。
推荐阅读
- python - gcsfs 异步接口似乎不起作用(使用简单示例时出错)
- applescript - applescript:对特定消息的自动响应
- powershell - Linq 语句的 Powershell 等效项
- sql - 如何将长口头日期时间转换为雪花中的时间戳(YY-MM-DD HH:MM:SS)?
- encryption - DPDK 加密设备调度程序“功能更新失败”
- python - 阻塞时间窗口车辆路径问题 ORTools
- docker - Kubernetes spark 算子:在 K8s 集群中启用主机网络需要做什么?
- javascript - 在不使用 jQuery、Node.js 或任何外部库的情况下,如何使用 HTML 文件读取本地存储的数据库(.db 文件类型)?
- java - 带有下一步或回滚的外部 API 调用
- r - 在 R 中为 Waffle() 函数使用字形