一:实例演示四个属性重载的魔术方法的使用方式
实例
<?php namespace _1008; // 属性重载 // __get(), __set(), __isset(), __unset() class Demo3 { private $name; private $sex; protected $email='php.cn@qq.com'; public function __construct($name, $sex) { $this->name = $name; $this->sex = $sex; } // 属性重载的方法 // 魔术方法: 不需要或不允许用户调用,由系统来调用 // __get(): 重载了用户对属性的访问 // __get()是读操作 public function __get($name) { if ($name === 'email') { return ($this->name === 'admin') ? '查看到的email是:'.$this->$name :'您好用户:'.$this->name. ',无权查看email'; } return $this->$name; } // __set()是改操作 public function __set($name,$value) { $this->$name=$value; } // __isset()是判断是否类中存在类中成员属性操作 public function __isset($name) { return isset($this->$name); } // __unset()是删除类中成员属性操作 public function __unset($name) { unset($this->$name); } } $obj = new Demo3('admi1n', '女'); //读 echo $obj->email.'<hr>'; //改 $obj->sex = '男'; echo $obj->sex.'<hr>'; //判断 echo isset($obj->name) ? '存在' : '没有'; echo '<hr>'; //删 unset ($obj->name); echo $obj->name;
运行实例 »
点击 "运行实例" 按钮查看在线实例
二:实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
实例
<?php namespace _1008; //函数中调用 function demo1($a,$b){ return "{$a}+{$b}=".($a+$b);// 双引号才解析值,单引号解析变量 } echo __NAMESPACE__.'<hr>'; echo call_user_func(__NAMESPACE__ . '\demo1', 11,22).'<br>'; echo call_user_func_array(__NAMESPACE__ . '\demo1', [22,33]).'<hr>'; //类中调用 class demo2 { public function sum($a, $b) { return "{$a}+{$b}=" . ($a+$b); } } $obj=new demo2(); //对象中的方法以回调方式调用 echo call_user_func_array([$obj,'sum'],[44,55]); echo '<br />'; //call_user_func_array ( [ 对象名,对象方法 ],[数组形式传值]) echo call_user_func_array([new demo2(),'sum'],[55,66]); echo '<hr>'; //静态调用 class Demo3 { public static function sum($a, $b) { return "{$a}+{$b}=" . ($a+$b); } } echo Demo3::class;// ::class,返回一个带有命名空间的类名称 echo '<br />'; echo call_user_func_array( __NAMESPACE__ . '\Demo3::sum',[77,88]); echo '<br />'; echo call_user_func_array([Demo3::class, 'sum'],[98,99]); echo '<hr>';
运行实例 »
点击 "运行实例" 按钮查看在线实例
三:实例演示方法重载的实现原理与参数获取方式
实例
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2019\10\11 0011 * Time: 10:22 */ class Demo1 { //__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 Demo1(); echo $obj->getTest('试试','试试就试试','真好玩'); echo '<br />'; echo Demo1::getName('零度','中国','年度最佳男优');
运行实例 »
点击 "运行实例" 按钮查看在线实例
四:实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
代码运行效果图:
实例
<?php namespace _1008; include 'Query.php'; class DB { // 连接对象 protected static $pdo = null; // 数据库的连接方法 public static function connection() { self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=ceshi','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('cates') ->field('cate_id,name,alias') ->where('cate_id > 1') ->limit(5) ->select(); // 遍历 foreach ($staffs as $staff) { print_r($staff); echo '<br>'; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
$query中的查询方法代码
实例
<?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;表示当前的对象Query 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()); // 查看生成的sql return $stmt->fetchAll(\PDO::FETCH_ASSOC); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:
属性重载的魔术方法比之前写的setname getname方法还有趣 __get可以重复使用查不同的不可见属性,之前写的getname方法只能写一个查一个(脑子有点乱,不知道老师能不能看明白这一句话)还有就是未定义的属性可以在类外直接定义读啊,改啊。
上个图吧:
方法重载方式:__call($name, $value)非静态类用的, __callStatic($name, $value)静态类专用的 加个__call后面加个静态英文词就行了首字母要大写,作用与属性方法的__get读操作异同
数据库的暂时写不出还得看用心视频。。。