美文网首页
「php化整为零系列」一、autoload

「php化整为零系列」一、autoload

作者: Bill_Wang | 来源:发表于2016-08-02 16:59 被阅读83次

源码地址:https://github.com/wilfordw/phpTutorial

该系列我只写我的理解,非官方解释,如不够专业请见谅

_autoload

作为一个面向对象语言,经常需要用new实例化类对象,但如果new另一个文件中的类对象,那首先要把文件加载进来(require_once)。如果每次new都要这样一个过程话,会非常繁琐,于是我们可以用php的自动加载功能定制特定加载规则。

ClassA.php

<?php
    class ClassA{ 
        public function __construct(){ 
            echo "ClassA load success!"; 
        } 
    } 

ClassB.php

<?php
class ClassB extends ClassA { 
    public function __construct(){ 
        parent::__construct(); 
        echo "ClassB load success!"; 
        } 
    } 

_autoload.php

<?php
    function __autoload($classname){
        $classpath = './'.$classname.'.php';
        if(file_exists($classpath)){
            require_once($classpath);
        }else{
            echo 'class file'.$classpath.' not found';
        }
    }

    new ClassA();//输出 ClassA load success!
    new ClassB();//输出 ClassA load success!ClassB load success!
    new ClassC();//输出 class file./ClassC.php not found

如上 只要在同一目录下就可以直接加载该目录已有的类。不过根据当前规则,类名必须要和文件名一致,加载目录下没有的类会报错。同时整个php生命周期内只能有一个__autoload函数,所以使用很有局限性,很难把控,目前已经基本弃用,被spl_autoload所代替

spl_autoload

spl_autoload引入自定义注册机制,这样就避免了__autoload 全局唯一引发冲突的尴尬,需要的使用调用bool spl_autoload_register ( [callback $autoload_function] ) 注册 ,不用了调用bool spl_autoload_unregister ( mixed $autoload_function )注销

<?php 
class LOAD 
{ 
    static function loadClass($class_name) 
    { 
        $filename = $class_name.".php"; 
        if (is_file($filename)) return require_once $filename; 
    } 
} 
/** 
* 设置对象的自动载入 
* spl_autoload_register — Register given function as __autoload() implementation 
*/ 
spl_autoload_register(array('LOAD', 'loadClass')); 
 
new ClassA();//实现自动加载,很多框架就用这种方法自动加载类 

spl_autoload_unregister(array('LOAD', 'loadClass'));

以上就用了spl_autoload 注册自动加载,实现加载ClassA,然后注销自动加载

该例子中由于是注册LOAD类中的loadClass,用了array('LOAD', 'loadClass'),如果只是调用脚本中的函数就直接可用函数名spl_autoload_register( 'loadClass')

相关文章

网友评论

      本文标题:「php化整为零系列」一、autoload

      本文链接:https://www.haomeiwen.com/subject/agofsttx.html