gpt4 book ai didi

PHP 的 "use"关键字和自动加载

转载 作者:可可西里 更新时间:2023-11-01 00:28:44 24 4
gpt4 key购买 nike

我的问题分为三个部分:

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

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

  3. 最好遵循哪种模式,为什么?当未使用 use 语句时,PhpStorm 将“不必要的完全限定名称...”显示为代码问题。

这是一个带有 use 语句的 Laravel Controller 的示例类定义:

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');
}
}

最佳答案

1) 当您执行 new Class() 语句时,该类会自动加载。

2) 见 1)

3) 最好遵循哪种模式,为什么?:

我建议使用 use,因为您可能会遇到这样一种情况:您的命名空间非常长,并且您的代码将变得不可读。

来自php docs :

This example attempts to load the classes MyClass1 and MyClass2 from the files MyClass1.php and MyClass2.php respectively.

<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
?>

命名空间只是组织类的附加功能。

编辑:正如@IMSoP 在评论中指出的那样,new 并不是自动加载器被触发的唯一时间。访问 class constant , static method , 或 static property也会触发它,就像运行 class_exists 一样。 .

关于PHP 的 "use"关键字和自动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com