【小白笔记】PHP学习之路 (22) --对象 __autoload spl_autoload_register 自动载入

来源:互联网 发布:滁州淘宝服饰 编辑:程序博客网 时间:2024/06/08 18:47

__autoload()     当调用了某个函数或实例化类,而在本文件中找不到时执行。

                             通过有规律的名字可以使用__autoload()函数自动载入需要的文件。


例如在action文件夹下有三个文件:

arcAction.php    channelAction.php    modelAction.php

这三个文件中包含了一个各自对应的类,类名与文件名相同。(只要有一定规律,可以通过字符串拼接得到即可)

在与action文件夹同级的目录common文件夹下有一个Action.php文件,

现在想在Action.php文件中访问action下三个文件中的类,直接的做法是将三个文件都

include一次。但是如果这三个文件之间也要进行类的访问的话,又得彼此include,

一旦目录名更改,修改起来非常麻烦。此时如果使用__autoload()函数就十分方便:

在action所在的文件夹下新建一个index.php文件,用于目录管理:

index.php

<?phpfunction __autoload($classname){include './action/'.$classname.'.php';}$a = isset($_GET['a'])?$_GET['a'].'Action':'index';$action = new $a();?>

这样,如果通过GET方法获得字符串arc,那么$a的值就是arcAction,

而在index.php中找不到arcAction这个类,这时就会自动执行__autoload()函数,

$a作为参数$classname被传递到__autoload函数内,拼接后的字符串是这样:

'./action/arcAction.php'

这时使用include函数,就会在action文件夹下找到arcAction.php文件,引入。

而arcAction.php中存在名为arcAction的类,引入后在index.php中自然就可以访问

arcAction.php中的类了。这时的index.php就起着类似目录管理的作用。

只要是通过index.php文件访问action目录下的文件,index.php都会将其自动载入。

当其他文件想要访问action目录中的文件时,只要把index.php引入即可。


spl_autoload_register()    功能与__autoload一样,只不过可以自定义函数名称。

当使用spl_autoload_register定义了执行函数之后,当找不到某个函数或类的时候,

将会执行自定义函数,而不是__autoload()。

例如:

spl_autoload_register('load_auto');spl_autoload_register(array('load','loadauto'));

上面一行指定以自定义的load_auto函数代替__autoload函数,下面一行则是指定类load的方法loadauto

来执行。注意此时类的方法loadauto要定义成静态的(public static)。

可以在类中定义自动载入函数:

class x{function __construct(){$this->config();}public static function load($filepath){include "{filepath}";}public function config(){spl_autoload_register(array(__CLASS__,'load'));}}


0 0
原创粉丝点击