php自动加载

很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。

在 PHP 5 中,不再需要这样了。可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

http://www.php.net/manual/zh/language.oop5.autoload.php

 

使用良好定义的自动加载,你无需担心一个类文件相对于当前类文件的什么位置;你只要简单的使用这个类,自动加载器将会执行文件查找任务。

另外,自动加载,因为它直到最后一刻才载入并确信匹配只出现一次,是一次巨大的性能提升——特别是在你部署之前如果花时间清除require_once()调用的时候

Zend Framework鼓励使用自动加载,并提供许多工具提供库代码和应用程序代码的自动加载

 

 

 

php自动载方法有两种.

第一种方案用__autoload,这个函数较简单,也较弱.

但有一问题没有解决, 就是在include前判断文件是否存在的问题.

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自动加载,这里具体说一下这个.

spl_autoload_register()

一个简单的例子

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()注册扩展名.

在找不到的清况下,还可以通过自己定义函数查找

function loader1($class)

{

//自己写一些加载的代码

}

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,解析出控制器与方法.

然后设置自动加载

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'));


 

路由,实例化控制器,调用方法,你写的东西就开始执行了
/**
 * 路由
 */
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');
}


 

你可能感兴趣的:(PHP,function,Class,Path,include,autoload)