<?php namespace _1008; class k{ private $a; //初始化 public function __construct($a) { $this->a=$a; } //重载 //1.读操作 //外部势力打探内部消息,需要传递消息的人,间谍 public function __get($a){ return $this->$a; } } $obj= new k('这是一个读操作'); echo $obj->a; echo'<hr>';
点击 "运行实例" 按钮查看在线实例
<?php namespace _1008; class k{ private $a; //初始化 public function __construct($a) { $this->a=$a; } //重载 //1.读操作 public function __get($a){ return $this->$a; } //2.写操作,更改, //外面的势力想更改内部势力成员就要安排内应处理 public function __set($a,$value) { $this->$a=$value; } } $obj= new k('这是一个读操作'); echo $obj->a; echo'<hr>'; $obj->a=6666; echo $obj->a ?>
点击 "运行实例" 按钮查看在线实例
<?php namespace _1008; class k{ private $a; //初始化 public function __construct($a) { $this->a=$a; } //重载 //外部势力不知有无消息,消息真假,派人打探,探子 public function __isset($a) { return isset($this->$a); } } $obj= new k('666'); echo isset($obj->a)?'存在':'不存在'; ?>
点击 "运行实例" 按钮查看在线实例
<?php namespace _1008; class k { private $a; //初始化 public function __construct($a) { $this->a=$a; } //重载 public function __get($a){ return $this->$a; } //外部势力销毁内部成员,需要内应行动 public function __unset($a) { unset($this->$a); } } $obj= new k('这是一个读操作'); echo $obj->a; echo'<hr>'; unset($obj->a); echo $obj->a; ?>
点击 "运行实例" 按钮查看在线实例
以下为实例演练回调:
<?php namespace _1008; function sub($a,$b) { return ($a-$b); } //回调执行函数 echo call_user_func_array(__NAMESPACE__.'\sub',[77,55]); ?>
点击 "运行实例" 按钮查看在线实例
<?php //回调对象 class k1 { public function sub($a,$b) { return ($a-$b); } } $obj = new k1(); echo call_user_func_array([$obj,'sub'], [99,66]); ?>
点击 "运行实例" 按钮查看在线实例
<?php //回调类 class k { public static function sub($a,$b) { return ($a-$b); } } echo call_user_func_array([k::class,'sub'], [8888,1111]); ?>
点击 "运行实例" 按钮查看在线实例
以下为实例演练方法重载:
<?php //方法重载 class k { public static function __callStatic($name,$args) { return '方法是:'.$name.'<br>参数列表:<pre>'. print_r($args,true); } } echo k:: b('方','法','重','载'); ?>
点击 "运行实例" 按钮查看在线实例
以下为实例演练数据库链式调用:
首先为query,数据库查询类
<?php // 数据库查询类 class Query { // 连接对象 public $pdo = null; // 表名 public $table; // 字段 public $field = '*'; // 条件 public $where; // 数量 public $limit; //以上为写SELECT语句时所用到的成分 // 构造方法,用来连接数据库 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 = '') { //为空时,返回当前空,不空,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(); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } } //然后用demo里方法重载来调用 ?>
点击 "运行实例" 按钮查看在线实例
然后是demo
<?php require 'Query.php'; class DB { // 连接对象 protected static $pdo = null; // 数据库的连接方法.完成数据库连接 public static function connection() { self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=chubu', 'root', 'root'); } //方法重载来调用 public static function __callStatic($name, $arguments) { // 连接数据库 self::connection(); // 实例化查询类,将连接对象做为参数,传给query $query = new Query(self::$pdo); // 调用查询对象$query中的对应的方法 return call_user_func_array([$query, $name],$arguments); } } $staffs = DB::table('ying') ->field('mov_id,name') ->where('mov_id > 1') ->limit(7) ->select(); // 遍历 foreach ($staffs as $staff) { print_r($staff); echo '<br>'; }
点击 "运行实例" 按钮查看在线实例
对于数据库的连接调用始实现,就是query和demo9.php这两个文件的代码,我理解为,将SELECT语句换了一种写法,原来的写法是:SELECT 字段 FROM 表名 WHERE 条件 LIMIT 显示数量。现在的写法相当于是把,字段,表名,条件,显示数量,在query内写作了一个个变量,然后用这些变量再组成SELECT语句,在query内写好SELECT语句后到demo9.php(相当于课件的demo5.php)里面连接数据库,然后用类的静态重载完成链式调用