学习PHP中的__autoload和spl_autoload_register

准备SportObject类

 1 <?php
 2 class SportObject {
 3     private $cont;
 4     public function __construct($cont) {
 5         $this->cont = $cont;
 6     }
 7     public function __toString() {
 8         return $this->cont;
 9     }
10 }

准备FoodObject类

 1 <?php
 2 class FoodObject {
 3     private $cont;
 4     public function __construct($cont) {
 5         $this->cont = $cont;
 6     }
 7     public function __toString() {
 8         return $this->cont;
 9     }
10 }

魔术方法__toString的作用是:

当使用 echo 或 print 输出对象时,将对象转化为字符串。

 

自动加载的原理以及__autoload的使用:

自动加载的原理,就是在我们new一个class的时候,PHP系统如果找不到你这个类,就会去自动调用本文件中的__autoload($class_name)方法,我们new的这个class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要new class_name的各种判断和划分就去require对应的路径类文件,从而实现自动加载。

 

spl_autoload_register的使用:
如果一个项目过大,或者需要不同的自动加载来加载不同路径的文件,这个时候__autoload就不好用了,
原因是一个项目中只能有一个这样的__autoload() 函数,因为PHP不允许函数重名,
也就是说你不能声明2个__autoload()函数文件,否则会报致命错误,
所以,可以用新的spl_autoload_register()来取代它。并且,它执行效率更高,更灵活。

//sql_autoload_resister($param) 这个参数可以有多种形式:
sql_autoload_resister('load_function'); //函数名
sql_autoload_resister(array('load_object', 'load_function')); //类和静态方法
sql_autoload_resister('load_object::load_function'); //类和方法的静态调用


//php 5.3之后,也可以像这样支持匿名函数了。
spl_autoload_register(function($className){
    if (is_file('./lib/' . $className . '.php')) {
        require './lib/' . $className . '.php';
    }
});


//同样也可以用类加载的方式调用,但是必须是static方法。
class autoloading{
    //必须是静态方法,不然会报错
    public static function load($className)
    {   
        require $className . '.php';
    }
}
//2种方法都可以
spl_autoload_register(array('autoloading','load')); 
spl_autoload_register('autoloading::load');

 

接下来,准备index.php测试

 1 <?php
 2 function __autoload($class_name) {
 3     // 根据PSR-O的第4点,把 \ 转换层(目录风格符)DIRECTORY_SEPARATOR,
 4     // 便于兼容Linux下文件找。
 5     // Windows下(/ 和 \)是通用的。
 6     // $wamp_path = '';
 7     // $wamp_path = 'D:\\Wamp64_v3\\www\\xxxxx\\learning\\syntax\\';
 8     $wamp_path = 'D:/Wamp64_v3/www/xxxxx/learning/syntax/';
 9 
10     $class_path = $wamp_path . $class_name . '.class.php';
11 
12     if (file_exists($class_path)) {
13         require_once($class_path);
14         echo '<pre>1、我是从这里引入的</pre>';
15     } else {
16         echo '类路径错误!';
17     }
18 }
19 
20 // spl_autoload_register是可以多次重复使用的,这一点正是解决了__autoload的短板。
21 // 那么如果有多个,执行顺序是按照注册的顺序,一个一个往下找,如果找到了就停止。
22 // spl_autoload_register使用时,__autoload会无效。
23 // 有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用。
24 spl_autoload_register('__autoload');
25 
26 spl_autoload_register(function($className) {
27     $wampPath = 'D:/Wamp64_v3/www/xxxxx/learning/syntax/';
28 
29     $classPath = $wampPath . $className . '.class.php';
30 
31     if (is_file($classPath)) {
32         require_once($classPath);
33         echo '<pre>2、我是从这里引入的</pre>';
34     }
35 });
36 
37 $mySport = new SportObject('江山代有才人出,各领风骚数百年。');
38 echo $mySport;
39 
40 $myFood = new FoodObject('会挽雕弓如满月,西北望,射天狼。');
41 echo $myFood;

测试结果

1、我是从这里引入的
江山代有才人出,各领风骚数百年。
1、我是从这里引入的
会挽雕弓如满月,西北望,射天狼。

 

转载于:https://www.cnblogs.com/tobyhan/p/11485032.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值