Correction status:qualified
Teacher's comments:尽管是把课堂代码几乎抄了一遍, 但是加上了自己解读, 非常不错的
1.实例演示四个属性重载的魔术方法的使用方式
<?php namespace _1014; class Task1 { private $name; protected $Class; private $studentID; private $message; public function __construct($name,$Class,$studentID) { $this->name=$name; $this->Class=$Class; $this->studentID=$studentID; } // 属性重载的方法 // '__***' 魔术方法:不需要或不允许用户调用,有系统来调用 // __get():重载了用户对属性的访问 // __get()属于读操作 public function __get($name) { if ($name/**当前属性 */==='name'||$name==='Class'||$name==='studentID' ) { return ($this->name/**值 */==='Mr赵'||$this->name==='admin') ? $this->$name : '无权查看' ; } return $this->$name; //返回的是当前的属性($name) } //__set(新值的属性名$name,值$value) 属于写操作 public function __set($name,$value) { if ($name==='Class') { return $this->name==='admin1' ? $this->$name=$value : $this->message='无权更改'; } return $this-> $name=$value;//等价于$this->salary=99999 } public function __isset($name) //__isset($name) 读操作 { return isset($this->$name); } public function __unset($name) { unset($this->$name); } } $obj = new Task1('Mr赵','三年二班','000001'); $obj1= new Task1('Miss赵','三年二班','000002'); $obj2= new Task1('admin','教师','1'); echo $obj->name.'-'.$obj->Class.'-'.$obj->studentID; echo '<hr>'; echo $obj1->Class; echo '<hr>'; $obj2->Class='校长'; echo $obj2->message; echo '<br>'; echo $obj2->name.'-'.$obj2->Class.'-'.$obj2->studentID; echo '<hr>'; echo isset($obj1->Class) ? '存在' : '不存在'; echo '<hr>'; unset ($obj1->name); echo '<br>'; echo $obj1->name;
点击 "运行实例" 按钮查看在线实例
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
<?php namespace _1014; function sum($a,$b) { return "{$a}+{$b}=" . ($a+$b); } echo call_user_func_array (__NAMESPACE__ . '\sum' ,[10,11]); echo '<hr>'; //在类中 // call_user_func_array([对象,方法],[***,***]) class Task2_1 { public function sum($a,$b) { return "{$a}+{$b}=" . ($a+$b); } } $obj = new /**namespace/ (可省略)*/Task2_1(); echo \call_user_func_array([$obj,'sum'],[21,12]); echo '<hr>'; //静态调用方法 class Task2_2 { public static function sum($a,$b) { return "{$a}+{$b}=" . ($a+$b); } } // ::class :返回一个带有命名空间的类名称 echo \call_user_func_array([Task2_2::class,'sum'],[34,13]);
点击 "运行实例" 按钮查看在线实例
3. 实例演示方法重载的实现原理与参数获取方式
<?php namespace _1014; class Task3 { // __call():访问一个不存在或无权限访问的方法的时候会自动调用 public function __call($name,$args) { return '方法是: '. $name. ', 参数列表: <pre>'. print_r($args, true); } // __callStatic():访问一个不存在或无权限访问的静态方法的时候会自动调用 public static function __callStatic($name,$args) { return '方法是: '. $name. ', 参数列表: <pre>'. print_r($args, true); } } echo (new Task3())->get(11,22,33); echo Task3:: staticGet(111,222,333);
点击 "运行实例" 按钮查看在线实例
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
<?php namespace _1015; 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; } public function select() // 生成SQL语句 { $sql='SELECT ' // 拼装SQL .$this->field // 字段列表 .' FROM ' .$this->table //数据表 .$this->where //条件 .$this->limit; //显示数量 $stmt= $this ->pdo->prepare($sql); // 预处理 $stmt->execute(); // die($stmt ->debugDumpParams(0)); //查看生成的sql return $stmt->fetchALL(\PDO::FETCH_ASSOC); } }
点击 "运行实例" 按钮查看在线实例
<?php namespace _1015; require 'task4.php'; class DB { protected static $pdo = null; // 连接对象 public static function connection() // 数据库的连接方法 { self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=test' , 'root','root' ); } public static function __callStatic($name,$arguments) { self::connection() ; // 连接数据库 $query = new Query(self::$pdo); // 实例化查询类,将连接对象做为参数 return \call_user_func_array([$query,$name],$arguments);// 调用查询对象$query中的对应的方法 } } $task = DB::table ('task') ->field('task_id,name,position') ->where('task_id >2') ->limit(4) ->select(); foreach ($task as $t) { \print_r($t); echo '<br>'; }
点击 "运行实例" 按钮查看在线实例