PHP实现自动加载机制

admin3年前PHP教程30
php自动加载

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/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实现自动加载机制的文章就介绍到这了,更多相关PHP自动加载内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

laravel与thinkphp之间的区别与优缺点

目录Laravel框架:问题描述:1、渲染模版方式的不同2、在实际开发中我们常常遇到这样的问题,就是开发地点不固定。3、Laravel框架提供了大量的闭包4、post传值中注意点不同5、条件判断语句书...

Docker 安装 PHP并与Nginx的部署实例讲解

安装 PHP 镜像查找 Docker Hub 上的 php 镜像:此外,我们还可以用 docker search php 命令来查看可用版本:这里我们拉取官方的镜像,标签为7.3.24-fpm-str...

php中日期类型转换实例讲解

1、使用date()函数将UNIX时间戳转换为日期。2、使用strtotime()函数将日期转换为UNIX时间戳。在PHP中是可以完成日期格式转换的,不过有一个缺点就是占用PHP解析器的解析时间,因此...

实例分析php常量和变量的不同

说明1、常量前没有美元符号;2、常量只能用define()函数和const关键字定义,不能用赋值语句定义;3、常量可以在任何地方定义和访问变量范围的规则;4、一旦定义了常量,就不能重新定义或取消定义,...

聊聊PHP中die()和sleep()函数的用法

在上一篇《聊聊PHP中删除字符串的逗号和尾部斜杠的方法》给大家介绍了PHP删除字符串中的逗号以及尾部斜杠的方法,感兴趣的朋友可以去学习了解一下~本文也将给大家通过示例来讲解标题所述“PHP...

PHP垃圾回收机制的一些理解

目录垃圾回收是什么东西?PHP 的垃圾回收算法垃圾回收对性能的影响总结相信只要入门学习过一点开发的同学都知道,不管任何编程语言,一个变量都会保存在内存中。其实,我们这些开发者就是在来回不停地操纵内存,...