php自動載方法有兩種.

但有一問題沒有解決, 就是在include前判斷文件是否存在的問題.php

1
2
3
4
5
6
7
8
9
10
11
12
13
set_include_path( 'aa'  . PATH_SEPARATOR . get_include_path());
function  __autoload( $className )
{
     //若是加這個檢測, 由於此文件不在當前目錄下,它就會檢測不到文件存在,
    //但include是能成功的
     if  ( file_exists ( $className  . '.php' )) {
     include_once ( $className  . '.php' );
     } else  {
         exit ( 'no file' );
     }
}
 
$a  = new  Acls();

第二種方案用spl自動加載,這裏具體說一下這個.sql

spl_autoload_register()app

一個簡單的例子框架

1
2
3
4
5
6
7
8
9
10
11
12
13
set_include_path( 'aa'  . PATH_SEPARATOR . get_include_path());
//function __autoload($className)
//{
//    if (file_exists($className . '.php')) {
//        include_once($className . '.php');
//    } else {
//        exit('no file');
//    }
//}
 
spl_autoload_register();
 
$a  = new  Acls();

spl_autoload_register()會自動先調用spl_autoload()在路徑中查找具備小寫文件名的".php"程序.默認查找的擴展名還有".ini",還能夠用spl_autoload_extenstions()註冊擴展名.函數

在找不到的清況下,還能夠經過本身定義函數查找this

spa

function loader1($class)code

{ci

//本身寫一些加載的代碼路由

}

function loader2($class)

{

//當loader1()找不到時,我來找

}

spl_autoload_register('loader1');

spl_autoload_register('loader2');

還能夠更多........

MVC框架是如何實現自動加載的

首先設置路徑

    'include' => array(
        'application/catalog/controllers',
        'application/catalog/models',    
    ),

$include = array('application/controllers', 'application/models', 'application/library');

set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $config['include']));

在獲取URL,解析出控制器與方法.

而後設置自動加載

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class  Loader
{
     /**
      * 自動加載類
      * @param $class 類名
      */
     public  static  function  autoload( $class )
     {
         $path  = '' ;
             $path  = str_replace ( '_' , '/' , $class ) . '.php' ;
         include_once ( $path );
     }
}
 
/**
  * sql自動加載
  */
spl_autoload_register( array ( 'Loader' , 'autoload' ));
路由,實例化控制器,調用方法,你寫的東西就開始執行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  * 路由
  */
public  function  route()
{
     if  ( class_exists ( $this ->getController())) {
         $rc  = new  ReflectionClass( $this ->getController());
         if  ( $rc ->hasMethod( $this ->getAction())) {
             $controller  = $rc ->newInstance();
             $method  = $rc ->getMethod( $this ->getAction());
             $method ->invoke( $controller );
         } else
             throw  new  Exception( 'no action' );
     } else
         throw  new  Exception( 'no controller' );
}
1
 
1
初步的自動加載就完成了
相關文章
相關標籤/搜索