Correction status:qualified
Teacher's comments:下次把作业名称写完整, 看名称 都不知你写的是什么?
<?php //call_user_func_array()回调函数; function sum($a, $b) { return $a + $b; } echo call_user_func_array('sum', [12, 25]); echo '<br>'; //call_user_func_array()回调类中的函数 class fun { public function sum($a, $b) { return $a + $b; } } echo call_user_func_array(array(new fun,'sum'),[12,22]); echo '<br>'; //对象中的方法以回调的方式调用 class fun2{ public function sum($a,$b){ return $a+$b; } } $obj=new fun2; echo call_user_func_array([$obj,'sum'],[52,22]); echo '<br>'; //对象中的静态方法以回调的方式调用 class fun1{ public static function sum($a,$b){ return $a+$b; } } $obj=new fun1; echo call_user_func_array('fun1::sum',[52,22]); ?>
点击 "运行实例" 按钮查看在线实例
小结:call_user_func_array()函数有两个参数,第一个参数是引用的回调函数,第二个参数是一个数组,作为参数传入回调函数。
二,实例演示方法重载的实现原理与参数获取方式
访问一个不存在或无权访问的方法时会自动调用__call方法,如:
<?php class a { public function __call($func,$arr){ return $func.'不存在'; } } $obj = new a; echo $obj->getsex(); ?>
点击 "运行实例" 按钮查看在线实例
访问一个不存在或无权访问的静态方法时会自动调用__callstatic()方法
<?php class b { public static function __callStatic($func,$arr){ return $func.'不存在'; } } echo b::getsex1(); ?>
点击 "运行实例" 按钮查看在线实例
小结:
__call()和__callstatic都有两个参数,第一个是自动接收的不存在的方法名,第二个是用数组的方式接收不存在的方法的参数,
实例演示数据库链接调用的实现原理与过程
<?php class Query { public $pdo; 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->this = empty($fields) ? '*' : $fields; return $this; } public function where($where) { //注意加上sql关键字'where' $this->where = empty($where) ? '' : ' WHERE ' . $where; return $this; } public function limit($limit) { $this->limit = empty($limit) ? '' : $limit; return $this; } public function select() { $sql = 'select ' . $this->field . ' from ' . $this->table . $this->where . $this->limit; //预处理sql语句 $stmt = $this->pdo->prepare($sql); $stmt->execute(); //打印一条 SQL 预处理命令 //die($stmt->debugDumpParams()); //返回相关结果 return $stmt->fetchall(\PDO::FETCH_ASSOC); } } class DB { protected static $pdo; //连接pdo方法 public static function connection() { self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=php', 'root', '210584'); } public static function __callStatic($name, $args) { self::connection(); $query = new Query(self::$pdo); return call_user_func_array([$query, $name], $args); } } $staffs = DB::table('staff') ->where("name='李达康'") //->field() ->select(); foreach ($staffs as $staff) { print_r($staff); echo '<br>'; } ?>
点击 "运行实例" 按钮查看在线实例
总结:
本节课学习了属性重载和方法重载,在访问一个不存在或无权访问的属性或方法时,通过魔术方法可以自动调用;