批改状态:合格
老师批语:除了看视频写作业外, 还要学会做笔记 , 总结知识点, 学会一种思维导图来整理
一:实例演示四个属性重载的魔术方法的使用方式
<?php
namespace _1008;
// 属性重载
// __get(), __set(), __isset(), __unset()
class Demo3
{
private $name;
private $sex;
protected $email='php.cn@qq.com';
public function __construct($name, $sex)
{
$this->name = $name;
$this->sex = $sex;
}
// 属性重载的方法
// 魔术方法: 不需要或不允许用户调用,由系统来调用
// __get(): 重载了用户对属性的访问
// __get()是读操作
public function __get($name)
{
if ($name === 'email') {
return ($this->name === 'admin') ? '查看到的email是:'.$this->$name :'您好用户:'.$this->name. ',无权查看email';
}
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('admi1n', '女');
//读
echo $obj->email.'<hr>';
//改
$obj->sex = '男';
echo $obj->sex.'<hr>';
//判断
echo isset($obj->name) ? '存在' : '没有';
echo '<hr>';
//删
unset ($obj->name);
echo $obj->name;点击 "运行实例" 按钮查看在线实例
二:实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
<?php
namespace _1008;
//函数中调用
function demo1($a,$b){
return "{$a}+{$b}=".($a+$b);// 双引号才解析值,单引号解析变量
}
echo __NAMESPACE__.'<hr>';
echo call_user_func(__NAMESPACE__ . '\demo1', 11,22).'<br>';
echo call_user_func_array(__NAMESPACE__ . '\demo1', [22,33]).'<hr>';
//类中调用
class demo2
{
public function sum($a, $b)
{
return "{$a}+{$b}=" . ($a+$b);
}
}
$obj=new demo2();
//对象中的方法以回调方式调用
echo call_user_func_array([$obj,'sum'],[44,55]);
echo '<br />';
//call_user_func_array ( [ 对象名,对象方法 ],[数组形式传值])
echo call_user_func_array([new demo2(),'sum'],[55,66]);
echo '<hr>';
//静态调用
class Demo3
{
public static function sum($a, $b)
{
return "{$a}+{$b}=" . ($a+$b);
}
}
echo Demo3::class;// ::class,返回一个带有命名空间的类名称
echo '<br />';
echo call_user_func_array( __NAMESPACE__ . '\Demo3::sum',[77,88]);
echo '<br />';
echo call_user_func_array([Demo3::class, 'sum'],[98,99]);
echo '<hr>';点击 "运行实例" 按钮查看在线实例
三:实例演示方法重载的实现原理与参数获取方式
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019\10\11 0011
* Time: 10:22
*/
class Demo1
{
//__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 Demo1();
echo $obj->getTest('试试','试试就试试','真好玩');
echo '<br />';
echo Demo1::getName('零度','中国','年度最佳男优');点击 "运行实例" 按钮查看在线实例
四:实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
代码运行效果图:

<?php
namespace _1008;
include 'Query.php';
class DB
{
// 连接对象
protected static $pdo = null;
// 数据库的连接方法
public static function connection()
{
self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=ceshi','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('cates')
->field('cate_id,name,alias')
->where('cate_id > 1')
->limit(5)
->select();
// 遍历
foreach ($staffs as $staff) {
print_r($staff); echo '<br>';
}点击 "运行实例" 按钮查看在线实例
$query中的查询方法代码
<?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($tableName)
{
$this->table = $tableName;
//return $this;表示当前的对象Query
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()); // 查看生成的sql
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
}点击 "运行实例" 按钮查看在线实例
总结:
属性重载的魔术方法比之前写的setname getname方法还有趣 __get可以重复使用查不同的不可见属性,之前写的getname方法只能写一个查一个(脑子有点乱,不知道老师能不能看明白这一句话)还有就是未定义的属性可以在类外直接定义读啊,改啊。
上个图吧:
方法重载方式:__call($name, $value)非静态类用的, __callStatic($name, $value)静态类专用的 加个__call后面加个静态英文词就行了首字母要大写,作用与属性方法的__get读操作异同
数据库的暂时写不出还得看用心视频。。。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号