php的自动加载机制

一、php中实现自动加载的方法  使用require,include,require_once,include_once手工进行加载。
  使用__autoload来进行自动加载
  使用spl的autoload来实现自动加载
  手工加载的实现:
  当需要加载的文件很少的时候我们可以使用第一个来完成。这样做很简单也没问题。
  [php]
  require_once 'a.php';
  require_once 'b.php';
  require_once 'c.php';
  require_once 'a.php';
  require_once 'b.php';
  require_once 'c.php';
  但是当需要加载文件很多的时候这样做还行吗?需要写十个,二十个require_once 或者更多的时候我们该怎么办?
  这个时候我们可以使用__autoload方法来简化我们的代码。
  __autoload加载的实现:
  我们在test目录下创建一个in.php文件,内容如下。
  [php]
  echo '我是test下面的in.php
';
  echo '我是test下面的in.php
';然后在test目录下创建一个loader.php,内容如下。
  [php]
  // 需要重载__autoload方法,自定义包含类文件的路径
  function __autoload($classname)
  {
  $class_file = strtolower($classname).".php";
  if (file_exists($class_file)){
  require_once($class_file);
  }
  }
  @$test = new in(); // 执行到这里会输出 我是test下面的in.php
  // 需要重载__autoload方法,自定义包含类文件的路径
  function __autoload($classname)
  {
  $class_file = strtolower($classname).".php";
  if (file_exists($class_file)){
  require_once($class_file);
  }
  }
  @$test = new in(); // 执行到这里会输出 我是test下面的in.php没问题,成功了!我们还可以创建其他的文件来进行加载,但是当需要的文件很多需要区分目录的时候怎么办?
  这时我们需要修改loader.php可以使用映射来找到要加载的文件。
  [php]
  function __autoload($class_name) {
  $map = array(
  'index' => './include/index.php',
  'in' => './in.php'
  );
  if (file_exists($map[$class_name]) && isset($map[$class_name])) {
  require_once $map[$class_name];
  }
  }
  new index();
  function __autoload($class_name) {
  $map = array(
  'index' => './include/index.php',
  'in' => './in.php'
  );
  if (file_exists($map[$class_name]) && isset($map[$class_name])) {
  require_once $map[$class_name];
  }
  }
  new index();
  这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。
  但是__autoload在一个项目中只能使用一次,当你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有 一个__autoload,这样两个__autoload就冲突了.解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的,应用场景单 一。
  spl的autoload加载实现:
  spl的autoload系列函数使用一个autoload调用堆栈,你可以使用spl_autoload_register注册多个自定义的autoload函数,应用场景广泛
spl的自动加载的相关函数


\

  spl_autoload 是_autoload()的默认实现,它会去include_path中寻找$class_name(.php/.inc) Spl_autoload实现自动加载:
  在test目录下建立in.php,内容如下
  [php]
  
  class in {
  public function index() {
  echo '我是test下面的in.php';
  }
  }
  ?>
  
  class in {
  public function index() {
  echo '我是test下面的in.php';
  }
  }
  ?> 在test目录下建立loader.php,内容如下
  [html]
  
  set_include_path("/var/www/test/"); //这里需要将路径放入include
  spl_autoload("in"); //寻找/var/www/test/in.php
  $in = new in();
  $in->index();
  
  set_include_path("/var/www/test/"); //这里需要将路径放入include
  spl_autoload("in"); //寻找/var/www/test/in.php
  $in = new in();
  $in->index();
  spl_autoload_register将函数注册到SPL __autoload函数栈中,修改loader.php
  [php]
  function AutoLoad($class){
  if($class == 'in'){
  require_once("/var/www/test/in.php");
  }
  }
  spl_autoload_register('AutoLoad');
  $a = new in();
  $a->index();
  function AutoLoad($class){
  if($class == 'in'){
  require_once("/var/www/test/in.php");
  }
  }
  spl_autoload_register('AutoLoad');
  $a = new in();
  $a->index();
  spl_autoload_register注册多个自定义的autoload函数的应用
  首先在test目录下建立mods文件夹并建立inmod.mod.php内容如下:
  [php]
  
  class inmod
  {
  function __construct()
  {
  echo '我是mods下的in';
  }
  }
  
  class inmod
  {
  function __construct()
  {
  echo '我是mods下的in';
  }
  }
  然后在test目录下建立libs文件夹并建立inlib.lib.php内容如下:
  [php]
  
  class inlib
  {
  function __construct()
  {
  echo '我是libs下的in';
  }
  }
  
  class inlib
  {
  function __construct()
  {
  echo '我是libs下的in';
  }
  } 最后在test目录下建立loader.php内容如下
  [php]
  
  class Loader {
  /**
  * 自动加载类
  * @param $class 类名
  */
  public static function mods($class) {
  if($class){
  set_include_path( "/var/www/test/mods/" );
  spl_autoload_extensions( ".mod.php" );
  spl_autoload( strtolower($class) );
  }
  }
  public static function libs($class) {
  if($class){
  set_include_path( "/var/www/test/libs/" );
  spl_autoload_extensions( ".lib.php" );
  spl_autoload( strtolower($class) );
  }
  }
  }
  spl_autoload_register(array('Loader', 'mods'));
  spl_autoload_register(array('Loader', 'libs'));
  new inmod();//输出我是mods下的in
  new inlib();//输出我是libs下的in
  
  class Loader {
  /**
  * 自动加载类
  * @param $class 类名
  */
  public static function mods($class) {
  if($class){
  set_include_path( "/var/www/test/mods/" );
  spl_autoload_extensions( ".mod.php" );
  spl_autoload( strtolower($class) );
  }
  }
  public static function libs($class) {
  if($class){
  set_include_path( "/var/www/test/libs/" );
  spl_autoload_extensions( ".lib.php" );
  spl_autoload( strtolower($class) );
  }
  }
  }
  spl_autoload_register(array('Loader', 'mods'));
  spl_autoload_register(array('Loader', 'libs'));
  new inmod();//输出我是mods下的in
  new inlib();//输出我是libs下的in