常海舰相籍空彻踢首性藏究荒
类的自动加载
1.如果要在当前脚本中使用很多对象时,就不得不在头部使用require或include加载很多的类文件
2.为了避免这种情况,推荐使用类的自动加载器,用户在创建对象时,就不必关心当前类是否已导入
3.类的自动加载,使用了标准php函数库中的spl_autoload_register()函数来实现
4.sql_autoload_register(类名),多个类名请放在数组中
新建Demo1.php,Demo2.php,demo2.php
Demo1.php:
<?php class Demo1 { const CLASS_NAME=__CLASS__;//__CLASS__:类名 }
Demo2.php
<?php class Demo2 { const CLASS_NAME=__CLASS__;//__CLASS__:类名 }
demo2.php
<?php /** * 类的自动加载 */ require "./class/Demo1.php"; require "./class/Demo2.php"; echo Demo1::CLASS_NAME; echo "<hr>"; echo Demo2::CLASS_NAME;
执行:
使用自动加载改写:
修改demo2.php
<?php /** * 类的自动加载 * * 1.类的自动加载,使用了标准php函数库中的spl_autoload_register()函数来实现 * 2.sql_autoload_register(类名),多个类名请放在数组中 * */ function loader($className) { require "./class/".$className.".php"; } spl_autoload_register('loader');//将loder()函数注册到标准函数库中 echo Demo1::CLASS_NAME; echo "<hr>"; echo Demo2::CLASS_NAME;
执行:
使用匿名函数改写:
修改demo2.php
<?php /** * 类的自动加载 * * 1.类的自动加载,使用了标准php函数库中的spl_autoload_register()函数来实现 * 2.sql_autoload_register(类名),多个类名请放在数组中 * */ spl_autoload_register(function($className){ require "./class/".$className.".php"; });//将loder()函数注册到标准函数库中 echo Demo1::CLASS_NAME; echo "<hr>"; echo Demo2::CLASS_NAME;
执行:
更完善的版本:
demo2.php
<?php /** * 类的自动加载 * * 1.类的自动加载,使用了标准php函数库中的spl_autoload_register()函数来实现 * 2.sql_autoload_register(类名),多个类名请放在数组中 * */ spl_autoload_register(function($className){ // 如果使用了命名空间需要将\替换为/ // str_replace('\\','/',$className); $path=__DIR__."./class/".$className.".php";//获取文件的绝对路径 if(file_exists($path) && is_file($path))//如果存在且是文件 { require $path; } });//将loder()函数注册到标准函数库中 echo Demo1::CLASS_NAME; echo "<hr>"; echo Demo2::CLASS_NAME;
执行:
咎顿摩挫耙伶狠邓扳滔鳖忙膝