那一天,人们终于回想起了被BUG支配的恐惧
Toggle navigation
Home
AboutMe
Links
Archives
Tags
PHP自动加载
2016-03-20 23:42:20
304
0
0
weibo-007
#为什么要使用PHP自动加载 php自动装载就是根据需要自动加载php类,而不需要显示的`include`文件。在一个项目中,如果一个文件有过多的include依赖,那自动加载将会使这种情况变得好转。 ``` <?php include "/libs/Token.class.php"; include "/libs/Auth.class.php"; include "/libs/Db.class.php"; include "/libs/Image.class.php"; ...//更多加载 class UserRegister { //code } ?> ``` 写一堆include是不是很费劲?有的人可能会说还好,但是再看一个例子 ``` <?php require "libs/Memcache.class.php"; require "libs/Redis.class.php"; if(Config::getCacheMode() == "memcache"){ $info = Memcache::get(1); }else{ $info = Redis::get(1); } echo $info; ``` 这个例子其实就是`资源浪费`了,因为无论如何,if-else只有一个分支回进去,当使用Memcache模式时,Redis引入进来是没有必要的;同样,当使用Redis模式时候,没有必要引入Memcache; 这时候,可以通过PHP的__autoload方法提供一种`lazyload`的机制,当第一次需要使用相关类时调用,这样就不会加载不必要的类。 #实现自动加载的方式 ##__autoload方式 php应用中,当我们实例化类的时候,如果在当前文件中找不到这个类,php会自动执行一个函数`__autoload`;看下面的例子: ``` <?php function __autoload($class){ echo "自动执行我"; } new Memcahce(); ?> ``` 运行php文件可以看到,`__autoload`函数被自动执行了,然后提示没有找这个类 ``` localhost:autoload MLS$ php index.php 自动执行我PHP Fatal error: Class 'Memcache' not found in /Users/MLS/autoload/index.php on line 6 ``` 通过上面的例子可以很明确的知道`__autoload`如何实现自动装载,就是在`__autoload`方法里面判断类是否存在,如果不存在,则`include`进来。假如我们的`User`类放在libs类目下面,并且命名为`User.class.php`。改下我们的`__autoload`实现自动加载 ``` <?php function __autoload($class){ echo "自动执行我"; include "libs/". $class. ".class.php"; } new Memcahce(); ``` 再次执行这段文件,程序被正常执行了 ``` localhost:autoload MLS$ php index.php 自动执行我Memcache类被自动装载了! ``` 但是,这个方法的缺点又来了,将所有的自动装载写到一个方法里面显然是不靠谱的。这样函数方法里面的代码爆炸. ##SPL方式 SPL是PHP标准库,同样我们可以采用SPL的方式实现自动装载,我们只需要注册自动状态的时候检索的路劲和后缀名称。 ``` <?php spl_autoload_extensions('.class.php');//注册搜索后缀 set_include_path(get_include_path().PATH_SEPARATOR.'libs/');//注册搜索路径 spl_autoload_register();//注册spl自动装载范式 new Memcache(); ``` 当运行这段代码的时候,虽然没有进行`Memcache`类的引入,当这段代码已经可以正常执行了 ``` localhost:autoload MLS$ php index.php Memcache类被自动装载了! ``` 但是,这种方式是不支持命名空间的,如果要实现支持命名空间,可以自己实现一个Autoloader类 ``` class Autoloader{ public static function autoload($className){ $pieces = explode('\\', $className); array_shift($pieces); $className = array_pop($pieces); $filePath = strtolower(implode("/", $pieces)) . "/{$className}.class.php"; if( file_exists($filePath) ){ require_once $filePath; } } } spl_autoload_register(array("Autoloader", "autoload")); ``` #自动装载规范 终于不用自己写autoload了!!!`如果你正在编写autoload,请停下来` PSR-4规范了如何指定文件路径从而自动加载类定义,同时规范了自动加载文件的位置,更多详情:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md 在此标准之上,Composer 横空出世!Composer 利用 PSR-0 和 PSR-4 以及 PHP5.3 的命名空间构造了一个繁荣的 PHP 生态系统,Composer安装:http://www.phpcomposer.com/。 目前PHP 界风头正劲的 Laravel 和 Symfony 均直接基于 Composer。下面延迟Composer威力. 新建App文件夹 ``` mkdir App ``` 在App文件夹内建立composer.json并放入以下内容 ``` { "require": { } } ``` 运行composer update,如果运行成功,会发现多了一个vendor文件,里面有一个autoload文件。 在App下建立lib库文件夹 ``` mkdir lib ``` 在lib文件夹下新增Log.class.php写入以下内容,新增一个日志处理工具 ``` <?php class Log{ public static function error($msg){ echo $msg; } } ``` 在App文件夹下新增index.php入口文件,写入以下内容 ``` <?php Log::error('ERROR!!'); ``` 我们知道上面的代码不可能运行,我们需要引入composer的autoload文件 改写index.php文件 ``` <?php require './vendor/autoload.php'; Log::error('ERROR!!'); ``` 配置composer.json中autoload目录 ``` { "require": { }, "autoload": { "classmap": [ "lib" ] } } ``` 再次运行,类被自动装载了 ``` sh-3.2# php index.php ERROR!! ```
Pre:
Memcache初探
Next:
数据库设计范式
0
likes
304
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.