实例演示四个属性重载的魔术方法的使用方式
实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
实例演示方法重载的实现原理与参数获取方式
实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现
课程笔记:
如果我们在类中,将属性或者方法前面加上static关键字,那么他们就会变成静态啊属性和静态方法。静态属性和方法是属于类的,不属于动态生成的对象,所以我们如果想要调用静态属性或者方法,就直接用类名来调用即可。
在类中,如果我们想要用当前对象的引用,就用$this代替。如果想要当前类的引用,就用self。
常量就是固定值,不允许被重新赋值,也不允许被删除。常量前面不需要加$符。常量是没有作用域限制的,可以全局调用。
同样的,类常量其实就是类当中的常量,定义方法是用const关键词去赋值。跟静态属性一样,类常量也是直接用类名来调用。跟静态属性的区别在于,静态属性可以修改,而类常量不能修改,静态属性不一定要初始化,但是类常量必须初始化。
实例演示四个属性重载的魔术方法的使用方式
今天学了四个魔术方法,分别是__get(),__set(),__isset(),__unset()。魔术方法就是不需要用户自定义,通过系统自动调用的。当用户访问没有权限或者不存在的时候,那么就可用重载方法来访问这些属性。
实例
<?php namespace _1008; //属性重载 class Demo3{ private $name; private $salary; protected $secret = '其实猪哥和朱老师不是一个人'; public function __construct($name,$salary) { $this->name = $name; $this->salary = $salary; } //__get() public function __get($name) { 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('朱老师',6666); echo $obj->name; echo '<hr>'; echo $obj->salary; echo '<hr>'; $obj->salary = 8888; echo $obj->salary; echo '<hr>'; echo isset($obj->salary)?'存在':'不存在'; echo '<hr>'; unset($obj->salary); echo isset($obj->salary)?'存在':'不存在'; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
实例
<?php namespace _1008; function sum($a, $b) { return "{$a} + {$b} =" . ($a + $b); } echo sum(22, 56); echo '<br>'; //回调执行函数 echo call_user_func_array(__NAMESPACE__ . '\sum', [55, 69]); echo '<br>'; class test1 { public function sum($a, $b) { return "{$a} + {$b} =" . ($a + $b); } } $obj = new test1(); //回调执行对象 echo call_user_func_array([$obj, 'sum'], [23, 78]); echo '<br>'; echo call_user_func_array([new Test1(), 'sum'], [221, 78]); echo '<br>'; class test2 { public static function sum($a, $b) { return "{$a} + {$b} =" . ($a + $b); } } //回调执行类 echo call_user_func_array(__NAMESPACE__ . '\Test2::sum', [53, 64]); echo '<br>'; echo call_user_func_array([Test2::class, 'sum'], [325, 234]); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例演示方法重载的实现原理与参数获取方式
用魔术方法__call()可以实现一个普通不存在的方法进行重定向去实现,相当于方法重载。
实例
<?php namespace _1008; class Demo5{ public function __call($name, $arguments) { return '调用的方法名是:'.$name.'参数列表是'.print_r($arguments,true); } } $obj = new Demo5(); echo $obj->getInfo(10,20,30);
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例演示数据库链接调用的实现原理与过程(静态方法重载__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($table){ $this->table = $table; return $this; } //设置字段 public function field($field = '*'){ $this->field = empty($field)?'*':$field; 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 = 'select '.$this->field.' from '.$this->table.$this->where.$this->limit; $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } }
首先我们做一个Query类,在该类中,我们把连接数据库需要的参数和方法都写进去,然后把初始化的函数写进去,当有不同的条件进去的时候,就把相应的类属性进行初始化,并且继续返回该对象,在下面写一个sql语句,把上面的条件进行拼接,并且连接数据库,返回相应的值,这样query类就完成了。
接下来是在实际的客户端中去调用。。
实例
<?php namespace _1008; //通过静态方法重载实现数据库链接调用。 require_once 'Query.php'; class DB{ //连接对象 protected static $pdo = null; //数据库链接 public static function connection(){ self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=huangsijie','root','root'); } public static function __callStatic($name, $arguments) { //连接数据库 self::connection(); //实例化查询类 $query = new Query(self::$pdo); return call_user_func_array([$query,$name],$arguments); } } $staffs = DB::table('staff')->field('staff_id,name,age')->where('staff_id >2')->limit(3)->select(); foreach ($staffs as $staff) { print_r($staff);echo '<br>'; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
我们先声明一个DB类,DB类复制连接数据库,然后用静态方法去重载query中的函数,如果当前类中没有相应的方法的话,那么就调用query类中的方法去实现。
至此我们就可以像框架那样用链式调用去写sql语句了。