实例演示四个属性重载的魔术方法的使用方式
实例演示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语句了。

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号