1. 实例演示四个属性重载的魔术方法的使用方式
__get($name):当获取未定义可不见属性时触发 读操作
实例
<?php namespace _10008; class Demo3 { private $name; private $salary; protected $secret = '其实都一样'; // 构造方法 public function __construct($name ,$salary) { $this->name = $name; $this->salary = $salary; } // 属性重载的方法 public function __get($name) { return $this->$name; } } $obj = new Demo3('毛老师',123); echo $obj->name,'<br>'; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
__set($name, $value):当给未定义可不见属性赋值时触发 写操作
实例
<?php namespace _10008; class Demo3 { private $name; private $salary; protected $secret = '其实都一样'; // 构造方法 public function __construct($name ,$salary) { $this->name = $name; $this->salary = $salary; } // 属性重载的方法 // __get($name):当获取未定义可不见属性时触发 读操作 // $name 是属性名 public function __get($name) { return $this->$name; } // __set($name, $value):当给未定义可不见属性赋值时触发 写操作 public function __set($name, $value) { $this->$name = $value; } } $obj = new Demo3('毛老师',123); echo $obj->name,'<br>'; $obj->salary = '565'; echo $obj->salary; echo '<hr>'; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
__isset($name): 当检测未定义可不见属性时触发
实例
<?php namespace _10008; class Demo3 { private $name; private $salary; protected $secret = '其实都一样'; // 构造方法 public function __construct($name ,$salary) { $this->name = $name; $this->salary = $salary; } // 属性重载的方法 // __get($name):当获取未定义可不见属性时触发 读操作 // $name 是属性名 public function __get($name) { return $this->$name; } // __set($name, $value):当给未定义可不见属性赋值时触发 写操作 public function __set($name, $value) { $this->$name = $value; } // __isset($name): 当检测未定义可不见属性时 public function __isset($name) { return isset($this->$name); } } $obj = new Demo3('毛老师',123); echo $obj->name,'<br>'; $obj->salary = '565'; echo $obj->salary; echo '<hr>'; echo isset($obj->salary) ? '存在' : '没有'; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
__unset($name): 当注销未定义可不见属性时触发
实例
<?php namespace _10008; class Demo3 { private $name; private $salary; protected $secret = '其实都一样'; // 构造方法 public function __construct($name ,$salary) { $this->name = $name; $this->salary = $salary; } // 属性重载的方法 // __get($name):当获取未定义可不见属性时触发 读操作 // $name 是属性名 public function __get($name) { return $this->$name; } // __set($name, $value):当给未定义可不见属性赋值时触发 写操作 public function __set($name, $value) { $this->$name = $value; } // __isset($name): 当检测未定义可不见属性时 public function __isset($name) { return isset($this->$name); } //__unset($name): 当注销未定义可不见属性时触发 public function __unset($name) { unset($this->$name); } } $obj = new Demo3('毛老师',123); echo $obj->name,'<br>'; $obj->salary = '565'; echo $obj->salary; echo '<hr>'; echo isset($obj->salary) ? '存在' : '没有'; unset($obj->salary); echo $obj->salary; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
实例
<?php namespace _1008; function sum($a, $b) { return $a . ' + ' . $b . ' = ' . ($a+$b); } // 正常函数调用 echo '正常函数调用: '.sum(20, 40); echo '<hr>'; // 对象方式调用 class Test1 { public function sum($a,$b) { // return "$a + $b = " . ($a + $b); return $a . ' + ' . $b .' = ' . ($a + $b); } } // 对象方式静态调用 class Test2 { public static function sum($a,$b) { // return "$a + $b = " . ($a + $b); return $a . ' + ' . $b .' = ' . ($a + $b); } } //echo call_user_func('\_1008\sum',20,60); // 以回调的方式执行该函数 echo '回调的方式执行该函数:'.call_user_func(__namespace__.'\sum',20,60); echo '<hr>'; // 回调方式数组 echo '回调的方式执行该数组:'. call_user_func_array(__NAMESPACE__.'\sum',[8,99]); echo '<hr>'; $obj = new Test1(); echo '回调的方式执行该对象:'. call_user_func_array([$obj, 'sum'],[20,53]); echo '<hr>'; // ::class ,返回一个带有命名空间的类名称 //echo '<hr>',Test1::class; echo '回调的方式执行该类:'. call_user_func_array([Test2::class, 'sum'], [15,22]); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
3. 实例演示方法重载的实现原理与参数获取方式
实例
<?php class Demo4 { // __call(): 访问不存在/不可见对象方法时触发,有两个参数,第一个是方法名,第二个方法的参数 public function __call($name, $args) { return '方法是:'. $name . '<br>参数列表:<pre>'.print_r($args,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 Demo4::getInfo2('html','css','js'); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
实例
<?php namespace _1008; // 查询数据库类 class Query { // 1. 连接对象 public $pao = null; // 2. 表名 public $table; // 3. 字段 * 查询所有字段 public $field = '*'; // 4. 条件 public $where; // 5. 数量 public $limit; // 6.连接数据库,用构造方法 public function __construct($pdo) { // 注:实例化时自动连接上数据库 $this->pdo = $pdo; } // 7. 设置数据表名称 public function table($tableName) { $this->table = $tableName; //注:返回当前实例,用来链式调用后面的其他方法 return $this; } // 8. 设置数据库字段 public function field($fields = '*') { $this->field = empty($fields) ? '*' : $fields; return $this; } // 9. 设置查询条件 public function where($where = '') { $this->where = empty($where) ? $where : ' WHERE '.$where; return $this; } // 10. 设置显示数量 public function limit($limit) { $this->limit = empty($limit) ? $limit : ' LIMIT '. $limit; return $this; } // 11. 生成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); } } ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
<?php <?php namespace _1008; require 'Query.php'; class DB { // Q 1.1 链接对象 protected static $pdo = null; // 数据库的链接方法 public static function connection() { self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=php','root' ,'root'); } public static function __callStatic($name, $arguments) { // 连接 数据库 self::connection(); // 实例化查询类 ,连接对象作为参数 $query = new Query(self::$pdo); return call_user_func_array([$query,$name],[$arguments[0]]); } } $staffs = DB::table(' staff') ->field(' staff_id,name,position,mobile') ->where('staff_id > 5') ->select(); foreach ($staffs as $staff){ print_r($staff);echo '<br>'; } ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例