类加载机制

类的自定义加载函数:spl_autoload_register()

PHP7以下版本,使用__autoload()实现类的自动加载;
PHP7以上版本,使用spl_autoload_register()实现类的自动加载。

(1)spl_autoload_register()何时调用?

当试图使用未定义的类时spl_autoload_register自动调用,
ü 使用new关键字创建不存在类的对象时,spl_autoload_register自动调用;例如:$obj = new Student()
ü 当使用静态化方式访问一个不存在的类时,spl_autoload_register自动调用,例如:Student::show();
ü 当继承一个不存在的类时,spl_autoload_register自动调用,例如:class Stu extends Parent{}
ü 当实现一个不存在的接口时,spl_autoload_register自动调用,例如:class Stu implements Inter

(2)语法格式

ü 描述:将函数注册到SPL(标准PHP库)的__autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。
ü 语法:bool spl_autoload_register ([ callback $autoload_function ] )
ü 参数:$autoload_function,欲注册的自动装载函数,可以是匿名函数,也可以是字符串的函数名称。$autoload_function有一个传递过来的类名形参,用于在函数中构建类文件路径。
ü 返回:成功时返回 TRUE, 或者在失败时返回 FALSE。

(3)使用普通函数作为参数

image.png

  1. <?php
  2. //类的自动加载:注册类的装载规则
  3. spl_autoload_register("func1");
  4. spl_autoload_register("func2");
  5. function func1($className){
  6. //构建类文件的路径
  7. $filename = "./public/$className.class.php";
  8. //如果类文件存在,则包含
  9. if(file_exists($filename)) require_once($filename);
  10. }
  11. function func2($className){
  12. //构建类文件的路径
  13. $filename = "./libs/$className.cla.php";
  14. //如果类文件存在,则包含
  15. if(file_exists($filename)) require_once($filename);
  16. }
  17. //创建学生类对象
  18. $obj1 = new Student();
  19. //创建教师类对象
  20. $obj2 = new Teacher();

(4)使用匿名函数作为参数

image.png

  1. <?php
  2. //类的自动加载:注册类的装载规则
  3. spl_autoload_register(function($className){
  4. //构建所有不同规则类文件路径
  5. $arr = array(
  6. "./public/$className.class.php",
  7. "./libs/$className.cla.php",
  8. );
  9. //循环数组
  10. foreach($arr as $filename)
  11. {
  12. //如果类文件存在,则包含
  13. if(file_exists($filename)) require_once($filename);
  14. }
  15. });
  16. //创建学生类对象
  17. $obj1 = new Student();
  18. //创建教师类对象
  19. $obj2 = new Teacher();

对象克隆

1、什么是对象克隆?

ü 如果已存在了一个对象,而还想再创建一个新对象,并且,两个对象的属性值不一样,或者属性比原来多 ,怎么实现呢? $obj2 = $obj1 无法实现!
ü $obj2 = $obj1,这不是复制对象,而是将$obj1和$obj2指向了同一个对象地址。
ü 创建新对象有两种方式:a. 使用new关键字; b. 使用 clone 关键字
image.png

2、实例:对象克隆的演示

image.png

3、实例:魔术方法__clone()在克隆对象中的使用

image.png

对象遍历

foreach既可以遍历数组元素,也可以遍历对象属性。
image.png

  1. <?php
  2. //定义一个学生类
  3. class Student
  4. {
  5. protected $name = "张三丰";
  6. private $age = 24;
  7. public $edu = "大专";
  8. //在类内遍历对象属性
  9. public function showInfo()
  10. {
  11. //在类外遍历对象的属性
  12. echo "<h2>在类内遍历对象的属性</h2>";
  13. foreach($this as $key=>$value)
  14. {
  15. echo "\$this->{$key} = {$value}<br>";
  16. }
  17. }
  18. }
  19. //创建学生类对象
  20. $obj = new Student();
  21. $obj->showInfo();
  22. //在类外遍历对象的属性
  23. echo "<h2>在类外遍历对象的属性</h2>";
  24. foreach($obj as $key=>$value)
  25. {
  26. echo "\$obj->{$key} = {$value}<br>";
  27. }