php spl_autoload_register demo 类的自动载入

5.类的自动载入

 

定义:  最早的php项目都是通过手工include或者require来载入依赖的文件的,

当项目变大时,一个文件要依赖几十个php类,

就需要写几十行require或者include语句,

这会导致管理很不方便,也会导致一些错误。

比如某个类删除了,但是require这个文件的语句没有去掉,

会报一个致命错误。这时候可以采用类自动载入的方式处理这种类依赖关系。

 

早期: require include

<?php

Test1::testa();

Test2::testb();

 

function __autoload($class)

{

require __DIR__.$class.'.php';

}

?>

 

version >= php5.3

 

定义:   5.3之后采用了更先进的 spl_autoload_register() 函数

spl_autoload_register()函数取代了autoload()函数,

可以兼容多个框架中的多个类的自动载入,

避免出现__autoload()在自动载入时会出现函数重复定义的报错

<?php

Test1::testa();

Test2::testb();

 

spl_autoload_register('autoloadFunction');

 

function autoloadFunction($class)

{

 

}

?>

 

psr-0

命名空间和绝对路径一致

类名首字母大写

文件名类名

1.命名空间必须与绝对路径一致

2.类名首字母必须大写

3.除入口文件外,其它“。PHP”必须只有一个类。

 

  

 include "Loader.php";

spl_autoload_register("\\Libs\\Loader::myloader");

 

loader.php  接收 不存在的类名字 去加载 

 

 

 

 

 

 

 

Blog:    http://blog.csdn.net/panpan639944806/article/details/23192267

在了解这个函数之前先来看另一个函数:__autoload。  

一、__autoload  

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:  

printit.class.php 
 
<?php 
 
class PRINTIT { 
 
 function doPrint() {
  echo 'hello world';
 }
}
?> 
 
index.php 
 
<?
function __autoload( $class ) {
 $file $class '.class.php';  
 if is_file($file) ) {  
  require_once($file);  
 }
 
$obj new PRINTIT();
$obj->doPrint();
?>

  

运行index.PHP后正常输出hello world。在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。  

在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。  

二、spl_autoload_register()  

再看spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:  

  
 
<?
function loadprint( $class ) {
 $file $class '.class.php';  
 if (is_file($file)) {  
  require_once($file);  
 
 
spl_autoload_register( 'loadprint' ); 
 
$obj new PRINTIT();
$obj->doPrint();
?>

将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。 

spl_autoload_register() 调用静态方法 

 

  
 
<? 
 
class test {
 public static function loadprint( $class ) {
  $file $class '.class.php';  
  if (is_file($file)) {  
   require_once($file);  
  
 }
 
spl_autoload_register(  array('test','loadprint')  );
//另一种写法:spl_autoload_register(  "test::loadprint"  ); 
 
$obj new PRINTIT();
$obj->doPrint();
?>

在了解这个函数之前先来看另一个函数:__autoload。  

一、__autoload  

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:  

printit.class.php 
 
<?php 
 
class PRINTIT { 
 
 function doPrint() {
  echo 'hello world';
 }
}
?> 
 
index.php 
 
<?
function __autoload( $class ) {
 $file $class '.class.php';  
 if is_file($file) ) {  
  require_once($file);  
 }
 
$obj new PRINTIT();
$obj->doPrint();
?>

  

运行index.PHP后正常输出hello world。在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。  

在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。  

二、spl_autoload_register()  

再看spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:  

  
 
<?
function loadprint( $class ) {
 $file $class '.class.php';  
 if (is_file($file)) {  
  require_once($file);  
 
 
spl_autoload_register( 'loadprint' ); 
 
$obj new PRINTIT();
$obj->doPrint();
?>

将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。 

spl_autoload_register() 调用静态方法 

  
 
<? 
 
class test {
 public static function loadprint( $class ) {
  $file $class '.class.php';  
  if (is_file($file)) {  
   require_once($file);  
  
 }
 
spl_autoload_register(  array('test','loadprint')  );
//另一种写法:spl_autoload_register(  "test::loadprint"  ); 
 
$obj new PRINTIT();
$obj->doPrint();
?>
posted @ 2017-09-02 11:37  silvercell  阅读(754)  评论(0)    收藏  举报