Re: [请益] 关于autoload

楼主: JohnRoyer (Zero 日落)   2018-01-26 22:51:03
: 想请问使用autoload把所有的class都自动加载进来,使用上非常方便,
: 但是这样如果我这支程式只会使用到某一个class,但是实际上是全部都加载了。
我是没听过 autoload 有一次把所有 class 全部加载的功能
反倒是用到的时候才加载
假设我有个 library 放在 lib/Hello.php
内容如下:
<?php
echo 'class loaded'; // 档案一被加载就会印出字串
class Hello {}
然后我们先用 require 的方式来加载 library 看看会怎样
<?php
require __DIR__ . '/lib/Hello.php'; // 显示 'class loaded'
// 做点别的事
$a = 1 + 2 + 3;
$o = new Hello();
在 require 那一行就会看到 Hello.php 已经被读取并执行到 echo 那行
再来改用 spl_autoload_register() 来实作 autoload 规则:
<?php
spl_autoload_register(function($className) {
require __DIR__ . '/lib/' . $className . '.php';
});
// 在 new Hello() 之前作点别的事
$a = 1 + 2 + 3;
$o = new Hello(); // 显示 'class loaded'
如果使用 autoload 的话
PHP 不会一次把所有的档案都加载
而是在需要使用的时候去检查档案是否已经加载
没有的话再去加载
也就是为什么第二个范例使用 autoload 的时候
会在 new 那行才看到 'class loaded'
不知道是不是你要的答案
希望有帮上忙
作者: wuwt4y (Poky)   2018-01-27 00:03:00
这样说是没错,只是想说php自己一定会先扫过,他才知道有哪些东西
楼主: JohnRoyer (Zero 日落)   2018-01-27 09:18:00
PHP 会扫,不过是按照指定的方式找档案像是档案存放路径规范是 PSR-4但我上面的范例没有按照 PSR-4,而是把 class 档都放在lib/ 目录下面
作者: wuwt4y (Poky)   2018-01-27 12:46:00
了解了,另外请问有工具可以直接看到我的namespace的结构吗

Links booklink

Contact Us: admin [ a t ] ucptt.com