Correction status:qualified
Teacher's comments:总结的很好
1 实例演示四个属性重载的魔术方法的使用方式
<?php // 实例演示四个属性重载的魔术方法的使用方式 // __get(),__set(),__isset(),__unset() class Demo1 { private $name; private $salary; protected $secret = '猪哥和朱老师不能说的秘密'; public function __construct($name,$salary) { $this->name = $name; $this->salary = $salary; } //属性重载方法 //__get():重载了用户对属性的方法,读操作; public function __get($name){ //访问secret属性 if($name === 'secret'){ //如果name是admin,返回secret,如果不是返回无权查看 return ($this->name === 'admin' ) ? $this->$name : '无权查看'; } return $this->$name; } //__set($name,$value):写操作 public function __set($name,$value) { //重写工资 if($name === 'salary') { return ($this->name === 'admin' ) ? $this->$name = $value : '没权限加工资哦' ; } return $this->$name = $value; } //__isset($name):检测是否存在这个属性(受保护、私有) public function __isset($name) { return isset($this->$name); } //__unset($name):销毁受保护、私有属性 public function __unset($name) { unset($this->$name); } } $obj = new Demo1('猪哥',66666); echo $obj->secret; echo '<br />'; $obj->salary = 99999; echo '工资:' . $obj->salary; echo '<hr>'; echo isset($obj->salary) ? '存在' : '不存在' ; echo '<hr>'; unset($obj->secret); echo isset($obj->secret) ? '存在' : '不存在' ; ?>
点击 "运行实例" 按钮查看在线实例
2 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
<?php namespace _1008; // call_user_func 回调 // call_user_func_array 数组回调 function sum($a,$b) { return "{$a}+{$b}=" . ($a+$b); } echo call_user_func(__NAMESPACE__ . '\sum', 11,22); echo '<br />'; echo call_user_func_array(__NAMESPACE__ . '\sum', [22,33]); echo '<hr>'; // 类中调用 class Demo1 { public function sum($a, $b) { return "{$a}+{$b}=" . ($a+$b); } } $obj=new Demo1(); //对象中的方法以回调方式调用 echo call_user_func_array([$obj,'sum'],[33,44]); echo '<br />'; //call_user_func_array ( [ 对象,方法 ],[数组]) echo call_user_func_array([new Demo1(),'sum'],[44,44]); echo '<hr>'; //静态调用 class Demo2 { public static function sum($a, $b) { return "{$a}+{$b}=" . ($a+$b); } } echo call_user_func_array( __NAMESPACE__ . '\Demo2::sum',[25,55]); echo '<br />'; // ::class,返回一个带有命名空间的类名称 echo call_user_func_array([Demo2::class, 'sum'],[99,22]); echo '<hr>';
点击 "运行实例" 按钮查看在线实例
3 实例演示方法重载的实现原理与参数获取方式
<?php class Demo3 { //__call():访问一个不存在或无权限访问的方法,会自动调用 public function __call($name,$args) { return '方法是:' . $name . '<br />参数列表:<pre>' . print_r($args,true); } //__callStatic():访问一个不存在或无权限访问的静态方法,会自动调用 public static function __callStatic($name,$args) { return '方法是:' . $name . '<br />参数列表:<pre>' . print_r($args,true); } } $obj = new Demo3(); echo $obj->getInfo1(1,2,3); echo '<br />'; echo Demo3::getInfo2('html','css','js');
点击 "运行实例" 按钮查看在线实例
4 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
运行结果截图:
Demo3.php文件
<?php require 'query.php'; class DB { //设置对象 protected static $pdo = null; //数据库的链接方法 public static function connection() { self::$pdo = new PDO('mysql:host=localhost;dbname=staff','root','root'); } public static function __callStatic($name, $arguments) { //连接数据库 self::connection(); //实例化查询类,将连接对象作为参数 $query = new Query(self::$pdo); //调用查询对象$query中的对应的方法 return call_user_func_array([$query,$name],$arguments); } } $staffs = DB::table('staff') ->field('staff_id,name,position,mobile') ->where('staff_id>2') ->limit(5) ->select(); //遍历 foreach($staffs as $staff){ print_r($staff); echo '<br />'; } ?>
点击 "运行实例" 按钮查看在线实例
query.php文件
<?php //数据库查询类 class Query { //链接对象 public $pdo = null; //表名 public $table; //字段 public $field = '*'; //条件 public $where; //数量 public $limit; //构造方法 public function __construct($pdo) { //实例时自动链接数据库 $this->pdo = $pdo; } //设置数据库表名 public function table($tableName) { $this->table = $tableName; //返回当前类实例,用来链式调用后门的其他方法 return $this; } //设置数据表字段 public function field($fields = '*') { $this->field = empty($fields) ? '*' : $fields; return $this; } //设置数据库条件 public function where($where = '') { $this->where = empty($where) ? $where : ' WHERE '. $where; return $this; } //设置显示数量 public function limit($limit) { $this->limit = empty($limit) ? $limit : ' LIMIT '. $limit; return $this; } //生成SQL语句 public function select() { // select * FROM table WHERE *** LIMIT n; //拼装SQL语句 $sql = 'SELECT ' . $this->field //字段列表 . ' FROM ' . $this->table //数据表名 . $this->where //查询条件 . $this->limit; //显示数量 //预处理 $stmt = $this->pdo->prepare($sql); $stmt->execute(); // die($stmt->debugDumpParams()); return $stmt->fetchALL(PDO::FETCH_ASSOC); } } ?>
点击 "运行实例" 按钮查看在线实例
小结:
1、四个魔术方法重载使用:可对受保护和私有属性进行操作
__get():只读取操作
__set():只重写操作
__isset():判断是否存在某属性
__unset():销毁属性
2、call_user_func_array():数组回调,( [对象,方法] , [数组] )
3、方法重载方式:
__call($name, $value)
__callStatic($name, $value)
4、数据库链接调用
4.1 首先写数据库链接文件,编写链式查询代码;
4.2 引入数据库链接文件,编写DB操作类,用call_user_func_array()函数调用查询对象$query中的对应方法;
4.3 组合查询语句,遍历出结果;
4.4 注意编写细节,每个变量和SQL语句不要出错,多写多理解。
其中以下截图不注意的结果,引以为戒: