首页 > 解决方案 > PHP 的“使用”关键字和自动加载

问题描述

我的问题分为三个部分:

  1. 放入use语句会立即触发自动加载器,还是等到使用该类?(延迟加载)

  2. 如果自动加载不是以延迟加载方式完成的,那会对性能产生负面影响吗?

  3. 哪种模式最好遵循,为什么?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');
    }
}

标签: phpnamespacesautoload

解决方案


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也会触发它。


推荐阅读