1 实例演示四个属性重载的魔术方法的使用方式
<?php
// 实例演示四个属性重载的魔术方法的使用方式
// __get(),__set(),__isset(),__unset()
class Demo1
{
private $name;
private $salary;
protected $secret = '猪哥和朱老师不能说的秘密';
public function __construct($name,$salary)
{
$this->name = $name;
$this->salary = $salary;
}
//属性重载方法
//__get():重载了用户对属性的方法,读操作;
public function __get($name){
//访问secret属性
if($name === 'secret'){
//如果name是admin,返回secret,如果不是返回无权查看
return ($this->name === 'admin' ) ? $this->$name : '无权查看';
}
return $this->$name;
}
//__set($name,$value):写操作
public function __set($name,$value)
{
//重写工资
if($name === 'salary')
{
return ($this->name === 'admin' ) ? $this->$name = $value : '没权限加工资哦' ;
}
return $this->$name = $value;
}
//__isset($name):检测是否存在这个属性(受保护、私有)
public function __isset($name)
{
return isset($this->$name);
}
//__unset($name):销毁受保护、私有属性
public function __unset($name)
{
unset($this->$name);
}
}
$obj = new Demo1('猪哥',66666);
echo $obj->secret;
echo '<br />';
$obj->salary = 99999;
echo '工资:' . $obj->salary;
echo '<hr>';
echo isset($obj->salary) ? '存在' : '不存在' ;
echo '<hr>';
unset($obj->secret);
echo isset($obj->secret) ? '存在' : '不存在' ;
?>点击 "运行实例" 按钮查看在线实例
2 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
<?php
namespace _1008;
// call_user_func 回调
// call_user_func_array 数组回调
function sum($a,$b)
{
return "{$a}+{$b}=" . ($a+$b);
}
echo call_user_func(__NAMESPACE__ . '\sum', 11,22);
echo '<br />';
echo call_user_func_array(__NAMESPACE__ . '\sum', [22,33]);
echo '<hr>';
// 类中调用
class Demo1
{
public function sum($a, $b)
{
return "{$a}+{$b}=" . ($a+$b);
}
}
$obj=new Demo1();
//对象中的方法以回调方式调用
echo call_user_func_array([$obj,'sum'],[33,44]);
echo '<br />';
//call_user_func_array ( [ 对象,方法 ],[数组])
echo call_user_func_array([new Demo1(),'sum'],[44,44]);
echo '<hr>';
//静态调用
class Demo2
{
public static function sum($a, $b)
{
return "{$a}+{$b}=" . ($a+$b);
}
}
echo call_user_func_array( __NAMESPACE__ . '\Demo2::sum',[25,55]);
echo '<br />';
// ::class,返回一个带有命名空间的类名称
echo call_user_func_array([Demo2::class, 'sum'],[99,22]);
echo '<hr>';点击 "运行实例" 按钮查看在线实例
3 实例演示方法重载的实现原理与参数获取方式

<?php
class Demo3
{
//__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 Demo3();
echo $obj->getInfo1(1,2,3);
echo '<br />';
echo Demo3::getInfo2('html','css','js');点击 "运行实例" 按钮查看在线实例
4 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
运行结果截图:

Demo3.php文件
<?php
require 'query.php';
class DB
{
//设置对象
protected static $pdo = null;
//数据库的链接方法
public static function connection()
{
self::$pdo = new PDO('mysql:host=localhost;dbname=staff','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('staff')
->field('staff_id,name,position,mobile')
->where('staff_id>2')
->limit(5)
->select();
//遍历
foreach($staffs as $staff){
print_r($staff); echo '<br />';
}
?>点击 "运行实例" 按钮查看在线实例
query.php文件
<?php
//数据库查询类
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;
}
//设置数据表字段
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());
return $stmt->fetchALL(PDO::FETCH_ASSOC);
}
}
?>点击 "运行实例" 按钮查看在线实例
小结:
1、四个魔术方法重载使用:可对受保护和私有属性进行操作
__get():只读取操作
__set():只重写操作
__isset():判断是否存在某属性
__unset():销毁属性
2、call_user_func_array():数组回调,( [对象,方法] , [数组] )
3、方法重载方式:
__call($name, $value)
__callStatic($name, $value)
4、数据库链接调用
4.1 首先写数据库链接文件,编写链式查询代码;
4.2 引入数据库链接文件,编写DB操作类,用call_user_func_array()函数调用查询对象$query中的对应方法;
4.3 组合查询语句,遍历出结果;
4.4 注意编写细节,每个变量和SQL语句不要出错,多写多理解。
其中以下截图不注意的结果,引以为戒:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号