博客列表 >类的封装性、 魔术方法的重载、类的自动加载以及类的继承与扩展

类的封装性、 魔术方法的重载、类的自动加载以及类的继承与扩展

一个好人
一个好人原创
2023年04月18日 14:45:29534浏览
  1. 类与对象、oop封装性、构造器
    类包括属性和方法,属性有三类;结构方法是魔术方法,可实现私有和保护属性赋值;

    1. class User
    2. {
    3. // 成员属性 public,private尽对本类可见,protected 对本类及子类可见,构成opp封装性
    4. public string $name;
    5. private int $salary;
    6. protected int $age;
    7. public string $sex;
    8. // 魔术方法,__开头,必须是公开的,构造方法是魔术方法的一类,__construct(),实例化时会被自动调用,用户无法调用,创造实例化初始状态
    9. public function __construct($name, $salary, $age)
    10. {
    11. $this->name=$name;
    12. $this->salary=$salary;
    13. $this->age=$age;
    14. }
    15. public function login()
    16. {
    17. return $this->salary;
    18. }
    19. public function register()
    20. {
    21. }
    22. }
  2. 魔术方法的应用:属性重载与方法重载
    子类可以通过extends继承父类,实现属性重载和方法重载,增加完善功能。

    1. class Son extends Product
    2. {
    3. // 可以扩展属性和方法
    4. public string $brand;
    5. // 可以重写构造方法
    6. public function __construct($name, $price, $num,$brand)
    7. {
    8. // parent调用父类参数
    9. parent::__construct($name, $price, $num);
    10. $this->brand = $brand;
    11. }
    12. public function total(){
    13. return "$this->name,数量为{$this->num},总计".($this->price*$this->num).'元';
    14. }
    15. }
  3. 类的原生自动加载
    利用spl_autoload_register实现类的自动加载
    1. // 类的自动加载
    2. spl_autoload_register(function($className){
    3. // echo $className;
    4. $classFile = __DIR__.DS.'class'.DS.$className.'.php';
    5. if(is_file($classFile)&&file_exists($classFile)) require $classFile;
    6. });
  4. 类的继承与功能扩展
    变量应该在model中赋值,在视图中使用,模板赋值时会自动调用系统函数,如get(),set(),__call()等
    1. class View{
    2. //模板变量在model中声明,在视图中使用
    3. protected $data = [];
    4. // 调用当前环境下未定义或不可访问的类属性时,重载方法__get会被调用。
    5. public function __get($name){
    6. return $this->data[$name];
    7. }
    8. // 赋值时自动调用
    9. public function __set($name, $value){
    10. $this->data[$name]= $value;
    11. }
    12. public function assign($name, $value=null){
    13. if(is_array($name)){
    14. $this->data = array_merge($this->data, $name);
    15. // 整合数组时,后者权重高,如有相同索引,后者覆盖前者
    16. }else{
    17. $this->data[$name] = $value;
    18. //也可以修改前面的值
    19. }
    20. }
    21. // 调用当前环境下未定义或不可访问的普通方法时,重载方法__call会被调用。
    22. public function __call($name,$args){
    23. if($name=='show'){
    24. return $this->data;
    25. }
    26. if($name=='sum'){
    27. return array_sum($args);
    28. }
    29. }
    30. }
    31. $v =new View;
    32. // 模板赋值
    33. $v->name = 'peter'; //自动调用__set()
    34. echo $v->name; //自动调用__get()
    35. $v->assign('id', 123);
    36. $v->assign(['email'=>'1234qq.com']);
    37. $v->show();
    38. echo $v->sum(12,23,34);
    39. var_dump($v);
    40. echo call_user_func([$v,'sum'], 34,45,56);

    总结:

    这是很重要的一块内容,不必纠结一些小错误;真正的富翁无需强调自己很有钱,真正的编程高手也不必强调自己很专业;小白才会在乎别人是否小瞧的自己,把精力放在更重要的事情上。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议