如何实现PHP类的自动加载

更新时间:2019-10-20 18:27:11 来源:青锋建站 作者:青锋建站

  在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。在 PHP 5 中,已经不再需要这样了, 通过PHP的自动加载机制可以实现类的自动加载。以下是青锋建站给大家分析的PHP自动加载机制与实现。

PHP自动加载机制接口

__autoload();
  由于在多人合作时并不方便,需求多个人进行同样的定义。
Spl_autoload_register();
  语法:spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
  将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
  spl_autoload_register()函数适合多人合作开发,自动注册自己的自动加载函数。 spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的。 使用Spl_autoload_register()注册若干个自动加载函数名时,然后需要类时就会依次调用这些函数,并试图加载这些类;如果前面的函数找到相应的类,则完成任务,如果第一个没有找到就会逐个寻找下去。一旦定义了自定义加载函数,则__autoload()函数则失效。
  使用建议:尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_register() 函数。 spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。
  注意1:在spl_autoload_register()中寻找类时,注意include与require的区别,include如果找不到会继续寻找,但是require找不到就会停止。
使用建议:
  注意2:在 PHP 5.3 之前,__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误(Fatal Error)。 自 PHP 5.3 起,能够 thrown 自定义的异常(Exception),随后自定义异常类即可使用。 __autoload 函数可以递归的自动加载自定义异常类。
  注意3:如果类名比如被用于 call_user_func(),则它可能包含一些危险的字符,比如 ../。 建议您在这样的函数中不要使用用户的输入,起码需要在 __autoload() 时验证下输入。

PHP类的自动加载实现实例

  本例尝试分别从 MyClass1.phpMyClass2.php 文件中加载 MyClass1MyClass2 类,这里我们使用了匿名函数,自PHP5.3.0起可以使用一个匿名函数。  
<?php
spl_autoload_register(function ($class_name) {
  require_once $class_name '.php';
});
$obj  = new MyClass1();
$obj2 = new MyClass2();
?>
  
以上就是青锋建站给大家分享的PHP实现类的自动加载的机制与方法,在开发一些PHP框架时经常用到自动加载的机制。青锋建站,专业网站建设开发,SEO,网络营销;面向PHP的原生开发,CMS建站开发,PHP框架开发。

转载请注明来源网址:青锋建站-http://www.sjzphp.com/webdis/spl_autoload_register_846.html

电话 15632335515 | 邮箱 943703539@qq.com | QQ 943703539 | 微信 qingfengjianzhan

Copyright © 2016-2026 青锋建站 版权所有