ASCII码 ASCII码

PHP类的自动加载小结

发布于:2022-04-23 15:57:07  栏目:技术文档

目录结构

Animal.php

  1. <?php
  2. /*
  3. * 动物类
  4. *
  5. */
  6. class Animal
  7. {
  8. // 属性前要有访问修饰符
  9. // public 默认的, 关键词定义类内、类外、子类都可见
  10. // protected 关键词定义类内、子类可见,类外不可见
  11. // private 关键词定义类内可见, 子类、类外不可见
  12. public $name;
  13. public $speed;
  14. public $food;
  15. private $age;
  16. protected $life;
  17. // 给private protected属性赋值
  18. // 魔术函数 : __set __get __call __callStatic
  19. // 构造函数 构造器 类每实例化一次 构造函数自动被调用
  20. public function __construct($name, $speed, $food, $age, $life)
  21. {
  22. // 类成员之间的互相访问 $this 本对象
  23. // 1.初始化类成员 让类/对象的状态稳定下来
  24. // 2.给对象的属性进行初始化赋值
  25. // 3.给私有或者受保护的成员属性赋值
  26. $this->name = $name;
  27. $this->speed = $speed;
  28. $this->food = $food;
  29. $this->age = $age;
  30. $this->life = $life;
  31. }
  32. public function run()
  33. {
  34. echo "{$this->name}正以{$this->speed}的速度奔跑。<br>";
  35. }
  36. public function eat()
  37. {
  38. echo "{$this->name}喜欢吃{$this->food}<br>";
  39. }
  40. }

Animal_carnivore.php

  1. <?php
  2. /*
  3. * 食肉动物类
  4. * 类的继承(扩展)extends
  5. * PHP oop具有单继承的诟病->带来程序的高耦合性:如果程序通过深层次继承绑定到某个具体的类,
  6. * 即使对父类做一些简单的修改,也会对子类带来严重的破坏性。
  7. * trait trait是为类似php这种单继承的语言而准备的一种代码复用的机制
  8. * 要追加的新功能放到一个trait里,然后让A组子类去use trait 不是类
  9. */
  10. class Animal_carnivore extends Animal
  11. {
  12. // 扩展属性
  13. private $ferocity;
  14. public function __construct($name, $speed, $food, $age, $life, $ferocity)
  15. {
  16. // parent 调用父类的成员
  17. // 调用父类构造函数
  18. parent::__construct($name, $speed, $food, $age, $life);
  19. $this->ferocity = $ferocity;
  20. }
  21. // 重写父类中的普通方法
  22. public function eat()
  23. {
  24. return parent::eat() . "它是{$this->ferocity}的食肉动物。<br>";
  25. }
  26. // 扩展方法
  27. public function hunting()
  28. {
  29. echo "{$this->name}通过伏击捕猎。<br>";
  30. }
  31. }

Fish.php

  1. <?php
  2. /*
  3. * 鱼类
  4. *
  5. * 类的静态成员 static 关键字标识, 静态成员由类本身来调用的,为所有实例共享
  6. * 优点
  7. * 1.在内存中即使存在多个实例,静态成员在内存中只占一份,为所有实例共享,普通成员以实例的方式会占用多个内存块
  8. * 2.静态成员的执行效率比实例化高,不需要类的实例化就能够访问静态成员。
  9. * 缺点:静态成员不自动进行销毁,而实例化的结果会被自动销毁
  10. */
  11. class Fish
  12. {
  13. public static $name = '巨齿鲨'; // 默认值
  14. static public $count = 0; // 记录构造函数实例化次数
  15. function __construct($name)
  16. {
  17. // self::类引用 在类中访问静态成员
  18. self::$name = $name;
  19. self::$count++;
  20. }
  21. // 静态方法中不能访问普通成员 只能访问静态成员
  22. static function login_count()
  23. {
  24. return sprintf('目前有%d条鱼。<br>', self::$count);
  25. }
  26. }
  27. // mvc架构模式 那么任何一个url请求都会定位到某一个具体的类(控制器)的方法中

autoload.php

  1. <?php
  2. /*
  3. * 类的自动加载器
  4. */
  5. spl_autoload_register(function ($class_name) {
  6. $class_file = dirname(__FILE__, 2) . DIRECTORY_SEPARATOR . 'oop' . DIRECTORY_SEPARATOR . $class_name . '.php';
  7. if (is_file($class_file) && file_exists($class_file)) {
  8. require $class_file;
  9. } else {
  10. throw new Exception('文件名不合法或者文件不存在。');
  11. }
  12. });

Animal_world.php

  1. <?php
  2. require __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
  3. $zebra = new Animal('斑马', '60公里/小时', '草', 6, 20);
  4. $zebra->run();
  5. $zebra->eat();
  6. $lion = new Animal_carnivore('狮子', '50公里/小时', '肉', 8, 14, '最凶猛');
  7. $lion->run();
  8. $lion->eat();
  9. $lion->hunting();
  10. echo '静态成员Fish::$name为:' . Fish::$name . '<br>';
  11. $Megalodon = new Fish('巨齿鲨');
  12. $Galeocerdo_cuvier = new Fish('虎鲨');
  13. $Sousa_chinensis = new Fish('中华白海豚');
  14. echo Fish::login_count();
相关推荐
阅读 +