PHP中的自动加载

PHP中的自动加载
目的:
new一个class时不需要写require。PHP 5.2新增自动加载的魔术方法__autoload($class_name)

一、__autoload()的使用
__autoload.php

$db = new DB();<font></font>
<font></font>
Height::test(); //也是支持静态方法直接调用的<font></font>
<font></font>
function __autoload($className)<font></font>
{<font></font>
require $className . '.php';<font></font>
}<font></font>

DB.php(同个目录下)

class DB<font></font>
{<font></font>
public function __construct()<font></font>
{<font></font>
echo 'Hello DB';<font></font>
}<font></font>
}<font></font>

Height.php(同个目录下)

class Height<font></font>
{<font></font>
public function __construct()<font></font>
{<font></font>
echo 'Hello Height';<font></font>
}<font></font>
<font></font>
public static function test(){<font></font>
echo 'Hello Height test';<font></font>
}<font></font>
}<font></font>

二、spl_autoload_register 使用
__autoload()不允许加载不同路径的文件,因为一个项目中只能有一个__autoload()。因此spl_autoload_register()诞生。当我们new一个找不到的class时,PHP会自动调用spl_autoload_register注册的函数

class autoloading{<font></font>
//必须是静态方法,不然报错<font></font>
public static function load($className)<font></font>
{<font></font>
require $className . '.php';<font></font>
}<font></font>
}<font></font>
//2种方法都可以<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
spl_autoload_register(阵列( '自动加载', '负载')); </font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
// spl_autoload_register('autoloading :: load');</font></font><font></font>
$db = new DB(); //会自动找到<font></font>

三、多个spl_autoload_register的使用

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">function load1($ className)</font></font><font></font>
{<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
回声1;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
if(is_file($ className。'。php')){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
需要$ className。</font><font style="vertical-align: inherit;">'.PHP';</font></font><font></font>
}<font></font>
}<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
function load2($ className)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
回声2;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
if(is_file('。/ app /'。$ className。'。php')){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
要求'./app/'。</font><font style="vertical-align: inherit;">$ className。</font><font style="vertical-align: inherit;">'.PHP';</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
function __autoload($ className)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
回声3;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
if(is_file('。/ lib /'。$ className。'。php')){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
要求'./lib/'。</font><font style="vertical-align: inherit;">$ className。</font><font style="vertical-align: inherit;">'.PHP';</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>
//注册了3个<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
spl_autoload_register( 'LOAD1');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
spl_autoload_register( 'LOAD2');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
spl_autoload_register( '__自动加载');</font></font><font></font>
$db = new DB(); //DB就在本目录下<font></font>
$info = new LibInfo(); //LibInfo 在/lib/LibInfo.php<font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
的var_dump(spl_autoload_functions());</font></font><font></font>

输出:

1<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
你好DB</font></font><font></font>
1<font></font>
2<font></font>
3<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
你好LibInfo</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
数组(大小= 3)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
0 =>字符串'load1'(长度= 5)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
1 =>字符串'load2'(长度= 5)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
2 =>字符串'__ autoload'(长度= 10)</font></font><font></font>

使用spl_autoload_functions()来查一共注册了多少个自动加载
spl_autoload_register()使用时,__autoload()会无效,必须重新注册进来才有效

四、spl_autoload_register自动加载+namespace命名空间
根据PSR-0的规范,使用namespace就能找到详细的路径,从而找到class文件
spl_autoload_register_namespace.php

//定义当前的目录绝对路径<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
define('DIR',dirname(__ FILE__));</font></font><font></font>
//加载这个文件<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
需要DIR。</font><font style="vertical-align: inherit;">'/loading.php';</font></font><font></font>
//采用`命名空间`的方式注册。php 5.3 加入的<font></font>
//也必须是得是static静态方法调用,然后就像加载namespace的方式调用,注意:不能使用use<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
spl_autoload_register( “\\自动加载\\装载::自动加载”); </font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
$ oMySQL = new Libary \ Db \ MySQL();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
$ oMySQL->熊();</font></font><font></font>
<font></font>
// 调用2个namespace类<font></font>
//定位到Libary目录下的Name.php <font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Libary \姓名::测试();</font></font><font></font>
//定位到App目录下Android目录下的Name.php<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
应用程序\ Android的\姓名::测试();</font></font><font></font>

loading.php

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">命名空间AutoLoading;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
class loading {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
public static function autoload($ className){</font></font><font></font>
//根据PSR-O的第4点 把 \ 转换层(目录风格符) DIRECTORY_SEPARATOR ,<font></font>
//便于兼容Linux文件找。Windows 下(/ 和 \)是通用的<font></font>
//由于namspace 很规格,所以直接很快就能找到<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
$ fileName = str_replace('\',DIRECTORY_SEPARATOR,DIR。'\'。$ className)。</font><font style="vertical-align: inherit;">'.PHP';</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
if(is_file($ fileName)){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
require $ fileName;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
} else {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo $ fileName。</font><font style="vertical-align: inherit;">'不存在';死;</font></font><font></font>
}<font></font>
}<font></font>
}<font></font>

Libary / DB / MySQL.php

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">namespace Libary \ Db;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
use Libary\Name; // use放这</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
MySQL类</font></font><font></font>
{<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共函数__construct()</font></font><font></font>
{<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">“”;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共静态功能测试()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">'静态功能测试';</font></font><font></font>
}<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共职能熊(){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
姓名::的getInstance(); </font><font style="vertical-align: inherit;">//呼叫Libary / Name.php的静态函数getInstance()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>
}<font></font>

Libary / Name.php

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">命名空间Libary;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
use Libary\Db\MySQL; // use放在这</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
班级名称</font></font><font></font>
{<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共函数__construct()</font></font><font></font>
{<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">“”;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共静态功能测试()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
// $ oMySQL = new Libary \ Db \ MySQL(); </font><font style="vertical-align: inherit;">// D:\ bear \ www \ test \ autoload \ Libary \ Libary \ Db \ MySQL.php不存在</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
// $ oMySQL = new Db \ MySQL(); </font><font style="vertical-align: inherit;">// 好</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
//使用Libary \ Db \ MySQL; </font><font style="vertical-align: inherit;">//解析错误:语法错误,意外“使用”(T_USE)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
$oMySQL = new MySQL(); // 打印第二个Libary\Db</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">'静态功能测试';</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
public static function getInstance(){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">“:的getInstance”;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>

应用/安卓/ Name.php

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">命名空间App \ Android;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
班级名称</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共函数__construct()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">“”;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共静态功能测试()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
echo __NAMESPACE__。</font><font style="vertical-align: inherit;">'静态功能测试';</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>

输出:

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Libary \ Db的</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Libary:的getInstance</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Libary \ Db的</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Libary静态功能测试</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
App \ Android静态功能测试</font></font><font></font>

s

...using __autoload() is discouraged and may be deprecated or removed in the future.
使用__autoload()是将会被弃用的(PHP 7.2.0),因为只能使用一次。应使用spl_autoload_register()

use Libary\Db\MySQL; // use使用绝对路径,放在class外面,namespace后面

参与评论