批改状态:合格
老师批语:
类与对象、oop封装性、构造器
类包括属性和方法,属性有三类;结构方法是魔术方法,可实现私有和保护属性赋值;
class User{// 成员属性 public,private尽对本类可见,protected 对本类及子类可见,构成opp封装性public string $name;private int $salary;protected int $age;public string $sex;// 魔术方法,__开头,必须是公开的,构造方法是魔术方法的一类,__construct(),实例化时会被自动调用,用户无法调用,创造实例化初始状态public function __construct($name, $salary, $age){$this->name=$name;$this->salary=$salary;$this->age=$age;}public function login(){return $this->salary;}public function register(){}}
魔术方法的应用:属性重载与方法重载
子类可以通过extends继承父类,实现属性重载和方法重载,增加完善功能。
class Son extends Product{// 可以扩展属性和方法public string $brand;// 可以重写构造方法public function __construct($name, $price, $num,$brand){// parent调用父类参数parent::__construct($name, $price, $num);$this->brand = $brand;}public function total(){return "$this->name,数量为{$this->num},总计".($this->price*$this->num).'元';}}
// 类的自动加载spl_autoload_register(function($className){// echo $className;$classFile = __DIR__.DS.'class'.DS.$className.'.php';if(is_file($classFile)&&file_exists($classFile)) require $classFile;});
class View{//模板变量在model中声明,在视图中使用protected $data = [];// 调用当前环境下未定义或不可访问的类属性时,重载方法__get会被调用。public function __get($name){return $this->data[$name];}// 赋值时自动调用public function __set($name, $value){$this->data[$name]= $value;}public function assign($name, $value=null){if(is_array($name)){$this->data = array_merge($this->data, $name);// 整合数组时,后者权重高,如有相同索引,后者覆盖前者}else{$this->data[$name] = $value;//也可以修改前面的值}}// 调用当前环境下未定义或不可访问的普通方法时,重载方法__call会被调用。public function __call($name,$args){if($name=='show'){return $this->data;}if($name=='sum'){return array_sum($args);}}}$v =new View;// 模板赋值$v->name = 'peter'; //自动调用__set()echo $v->name; //自动调用__get()$v->assign('id', 123);$v->assign(['email'=>'1234qq.com']);$v->show();echo $v->sum(12,23,34);var_dump($v);echo call_user_func([$v,'sum'], 34,45,56);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号