一. 实例演示四个属性重载的魔术方法的使用方式
1.__get($name)方法:当外部访问一个不存在或者无限性的属性时候自动调用
2.__set($name, $value)方法
3.__isset($name)测试属性存不存在调用;
4.__unset($name);删除一个方法;
下面Demo3类中四个方法同时展示
<?php namespace _1008; //对象属性的重载技术 class Demo3 { private $name; private $salary; protected $secret='我***只有100元'; public function __construct($name,$salary) { $this->name=$name; $this->salary=$salary; } //属性重载的方法,当外部访问一个不存在或者无限性的属性时候自动调用 public function __get($name) { return $this->$name; } //写操作方法————set public function __set($name, $value) { if ($name === 'salary') { return $this->name === 'admin' ? $this->$name = $value : '无权更新工资'; } return $this->$name = $value; } //isset测试属性存不存在使用 public function __isset($name) { return isset($this->$name); } //删除方法__unset() public function __unset($name) { unset($this->$name); } } $obj = new Demo3('admin', 6666); echo $obj->name;
点击 "运行实例" 按钮查看在线实例
二、echo call_user_func(),echo call_user_func_array();以函数参数的方式,执行一个函数,以回调的方式执行函数。
实例 //创建一个函数 function sum($a,$b) { return"$a+$b=".($a+$b); } //使用echo call_user_func()方法 echo call_user_func(__NAMESPACE__.'\sum',130,66); echo '<hr>'; //使用call_user_func_array()方法 echo call_user_func_array(__NAMESPACE__.'\sum',[500,600]); echo '<hr>'; 运行实例 » 点击 "运行实例" 按钮查看在线实例
//创建一个类 class Test1 { function sum($a,$b) { return"$a+$b=".($a+$b); } } //实例化 new $obj=new namespace\Test1(); //使用echo call_user_func()方法 echo call_user_func_array([$obj,'sum'],[800,700]); echo '<hr>'; ////使用call_user_func_array()方法 echo call_user_func_array([new Test1(),'sum'],[80,70]); echo '<hr>';
点击 "运行实例" 按钮查看在线实例
//创建一个类,类里有一个静态方法 class Test2 { public static function sum($a,$b) { return"$a+$b=".($a+$b); } } //使用echo call_user_func()方法 echo call_user_func_array(__NAMESPACE__.'\Test2::sum',[66,88]); echo '<br>'; //使用call_user_func_array()方法 echo call_user_func_array([Test2::class,'sum'],[96,808]);
点击 "运行实例" 按钮查看在线实例
三、方法重载,1.__call, 2__callstatic;
//创建一个类,使用__call(),__callstatic(), class Demo4 { // 普通方法,重载 __call public function __call($name, $arguments) { return '方法是:'.$name.'<br>参数列表:<pre>'.print_r($arguments,true); } //静态方法,重载 __callstatic public static function __callStatic($name, $arguments) { return '方法是:'.$name.'<br>参数列表:<pre>'.print_r($arguments,true); } } echo '<hr>'; $obj=new Demo4(); echo $obj->getInfo1(10,20,30); echo '<hr>'; echo Demo4::getInfo2('html','css','js');
点击 "运行实例" 按钮查看在线实例
四、.实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
<?php namespace _1008; //数据库 查询类 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(){ //拼接SQL语句 $sql=' SELECT '.$this->field.' FROM ' . $this->table.$this->where.$this->limit; //预处理 $stmt = $this->pdo->prepare($sql); $stmt->execute(); // die($stmt->debugDumpParams()); // 查看生成的sql return $stmt->fetchall(\PDO::FETCH_ASSOC); } }
点击 "运行实例" 按钮查看在线实例
<?php namespace _1008; require 'Query.php'; class DB { protected static $pdo=null; //数据库的链接方法 public static function connection() { //连接 ouyangke 数据库 self::$pdo= new \PDO('mysql:host=127.0.0.1;dbname=ouyangke','root','root'); } public static function __callStatic($name, $arguments) { //链接数据库 self::connection(); //实例化查询类 $query=new Query(self::$pdo); //调用查询对象$query中的对应方法 return call_user_func_array([$query,$name],$arguments); } } $mov=DB::table('movies') ->field('mov_id,name') ->limit(5) ->where('mov_id>2') ->select(); //遍历数据 foreach ($mov as $m){ print_r($m); echo '<br>'; }
点击 "运行实例" 按钮查看在线实例
最后执行结果:
总结:
先创建一个类Query.php,创建一个query类,用于数据库的连接查询,设置对象属性;public $pdo=null;public $table;public $field='*';public $where;public $limit;,使用构造方法连接数据库,给对象属性设置方法以便调用,最后生成SQL语句, 加预处理!
再创建一个demo5.php文档,把'Query.php'连接进来,建立了一个DB类,类里面设置静态方法connection()连接数据库,使用静态重载方法__callStatic,连接数控,在类中实例化Query.php中的query类,调用里面的查询方法。注意关键字'SELECT ' ' WHERE ' ' LIMIT '的前后空格,使用 die($stmt->debugDumpParams());查看生成的sql语句 SELECT mov_id,name FROM movies WHERE mov_id>2 LIMIT 5 在这里,我连接了 ‘ouyangke’数据库,然后查询为movies的数据表,根据查询条件 查询,表里的mov_id,name,按查询方法,我只要mov_id>2的条目,只需查询到的数据要前5条!
ps:迟来的作业,一步一步理解后把作业交上,希望老师多多谅解,,很多细节没有总结到位。希望老师批语