类与对象、oop封装性、构造器,魔术方法的应用

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
一、类与对象、oop封装性、构造器
  1. /**
  2. * 1. 类文件名称与类名称一样
  3. * 2. 变量是实现数据的复用,函数是实现了代码块的复用
  4. * 3. 类是具有相同属性和方法的对象的集合
  5. * 4. 对象 是复合数据类型
  6. * 5. oop 单位是对象,对象是类实例化的结果
  7. */
  1. // ! 1. 类 与 对象
  2. class User
  3. {
  4. // 成员属性,一定要有访问修饰符
  5. // ! 2. OOP封装性
  6. /**
  7. * public: 公共的(类外可以访问)
  8. * private: 私有的(只能本类访问)
  9. * property:受保护的(仅对本类和子类访问,类外无法访问)
  10. * 构成OOP封装性(继承、多态)
  11. */
  12. public string $name; // 定义增加类型,
  13. private int $salary;
  14. protected int $age;
  15. // 魔术方法 必须是公有的,为系统所调用,用户不能直接调用
  16. // __set __get _call __callStatic
  17. // ! 3 构造器
  18. // 特殊的成员方法 __construct
  19. // 用途:创建实例化出事状态,属性赋值(私有属性),调用方法
  20. public function __construct($name,$salary,$age)
  21. {
  22. // 代表本对象
  23. $this->name = $name;
  24. $this->salary = $salary;
  25. $this->age = $age;
  26. }
  27. // 成员方法:
  28. public function say(){
  29. return $this->name . '会说话,他现在的工资是' . $this->salary;
  30. }
  31. }
  32. // 实例化
  33. //$james = new User();
  34. $james = new User('Jordan', 10000, 18);
  35. //var_dump($james);
  36. // 给对象属性赋值
  37. $james->name = 'Jordan';
  38. // 对象属性访问: ->
  39. echo "<pre>";
  40. echo $james->name;


二、魔术方法的应用(属性重载与方法重载)2.1、属性重载
  1. // 属性拦截器 重载
  2. // 访问当前环境下不存在 或者不可见的成员时,会被自动调用
  3. // 原始属性value不会因此而改变
  4. public function __get($name){
  5. $res = 0;
  6. if($name === 'salary')
  7. {
  8. $res = $this->$name - 5000;
  9. }else{
  10. $res = $this->$name;
  11. }
  12. return $res;
  13. }
  14. // 未当前环境下不存在,或者不可见的成员赋值时,会被自动调用
  15. // 原始属性value会根据而改变
  16. public function __set($name, $value)
  17. {
  18. if($name === 'salary')
  19. {
  20. $this->$name += $value;
  21. } else {
  22. $this->$name = $value;
  23. }
  24. }
  1. //实例化
  2. $james = new User();
  3. // 对象属性访问: ->
  4. echo "<pre>";
  5. echo $james->name . '<br />';
  6. echo $james->salary. '<br />'; //5000 __get
  7. var_dump($james); // 10000
  8. $james->salary = 2000; // __set
  9. echo $james->salary. '<br />'; // 7000
  10. var_dump($james); // 12000


2.2、方法重载 _call()
  1. // ! 4. 魔术方法 __call()
  2. // 方法重载
  3. public function __call($name, $args)
  4. {
  5. if($name == 'hello')
  6. {
  7. return <<<DATA
  8. $this->name:
  9. 工资($this->salary)
  10. 对象($this->age)
  11. DATA;
  12. }
  13. if ($name == 'sum') {
  14. return array_sum($args);
  15. }
  16. }
  1. //实例化
  2. $james = new User();
  3. // 方法:
  4. echo $james->say() . '<br />';
  5. echo $james->hello() . '<br />';
  6. echo call_user_func([$james, 'sum'],10,20,30) . '<br />';
  7. echo call_user_func_array([$james,'sum'],[10,20,30]);


三、类的原生自动加载类的自动加载器 autoload.php
  1. <?php
  2. // 类的自动加载器
  3. spl_autoload_register(function ($className) {
  4. //var_dump($className);
  5. $classFile = __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . $className . '.php';
  6. if(is_file($classFile) && file_exists($classFile))
  7. require $classFile;
  8. });
引入类的自动加载器 client.php
  1. <?php
  2. // 客户端代码
  3. // 引入类的自动加载器
  4. require __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
  5. /*
  6. require __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'Product.php';
  7. require __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'User.php';
  8. */
  9. echo "<pre>";
  10. $i = new Product("iphone 14 pm", 9999, 12);
  11. echo $i->show() . "<pre>";
  12. $u = new User("peter",12000,12);
  13. echo $u->say();


四、类的继承与功能扩展父类 Product.php
  1. <?php
  2. class Product
  3. {
  4. public string $name;
  5. protected float $price;
  6. protected int $num;
  7. public function __construct($name, $price, $num)
  8. {
  9. $this->name = $name;
  10. $this->price = $price;
  11. $this->num = $num;
  12. }
  13. // 普通方法
  14. public function show()
  15. {
  16. return <<<SHOW
  17. 1.品名:$this->name
  18. 2.价格:$this->price
  19. 3.属性:$this->num
  20. SHOW;
  21. }
  22. }
Son类 Son.php:继承与功能扩展
  1. <?php
  2. // 类的继承 扩展 extends
  3. // Son 继承 Product
  4. class Son extends Product
  5. {
  6. // 扩展父类属性
  7. public string $brand;
  8. public function __construct($name, $price, $num, $brand)
  9. {
  10. // 扩展父类功能
  11. // parent::调用父类成员
  12. // self:: 类的引用,静态成员的访问
  13. parent::__construct($name, $price, $num);
  14. $this->brand = $brand;
  15. }
  16. // 重写 出现再成绩上下文里
  17. public function show()
  18. {
  19. return parent::show() . <<<SON
  20. 4.品牌:$this->brand
  21. SON;
  22. }
  23. // 扩展功能
  24. public function total()
  25. {
  26. return "$this->name,数量为{$this->num},总计:" . ($this->price * $this->num) . "元";
  27. }
  28. }

【感谢龙石为本站提供api接口平台 http://www.longshidata.com/pages/apigateway.html】