准备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、我是从这里引入的 会挽雕弓如满月,西北望,射天狼。