批改状态:合格
老师批语:尽管是把课堂代码几乎抄了一遍, 但是加上了自己解读, 非常不错的
1.实例演示四个属性重载的魔术方法的使用方式

<?php
namespace _1014;
class Task1
{
private $name;
protected $Class;
private $studentID;
private $message;
public function __construct($name,$Class,$studentID)
{
$this->name=$name;
$this->Class=$Class;
$this->studentID=$studentID;
}
// 属性重载的方法
// '__***' 魔术方法:不需要或不允许用户调用,有系统来调用
// __get():重载了用户对属性的访问
// __get()属于读操作
public function __get($name)
{
if ($name/**当前属性 */==='name'||$name==='Class'||$name==='studentID' ) {
return ($this->name/**值 */==='Mr赵'||$this->name==='admin') ? $this->$name : '无权查看' ;
}
return $this->$name; //返回的是当前的属性($name)
}
//__set(新值的属性名$name,值$value) 属于写操作
public function __set($name,$value)
{
if ($name==='Class') {
return $this->name==='admin1' ? $this->$name=$value : $this->message='无权更改';
}
return $this-> $name=$value;//等价于$this->salary=99999
}
public function __isset($name) //__isset($name) 读操作
{
return isset($this->$name);
}
public function __unset($name)
{
unset($this->$name);
}
}
$obj = new Task1('Mr赵','三年二班','000001');
$obj1= new Task1('Miss赵','三年二班','000002');
$obj2= new Task1('admin','教师','1');
echo $obj->name.'-'.$obj->Class.'-'.$obj->studentID;
echo '<hr>';
echo $obj1->Class;
echo '<hr>';
$obj2->Class='校长';
echo $obj2->message;
echo '<br>';
echo $obj2->name.'-'.$obj2->Class.'-'.$obj2->studentID;
echo '<hr>';
echo isset($obj1->Class) ? '存在' : '不存在';
echo '<hr>';
unset ($obj1->name);
echo '<br>';
echo $obj1->name;点击 "运行实例" 按钮查看在线实例
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式

<?php
namespace _1014;
function sum($a,$b)
{
return "{$a}+{$b}=" . ($a+$b);
}
echo call_user_func_array (__NAMESPACE__ . '\sum' ,[10,11]);
echo '<hr>';
//在类中
// call_user_func_array([对象,方法],[***,***])
class Task2_1
{
public function sum($a,$b)
{
return "{$a}+{$b}=" . ($a+$b);
}
}
$obj = new /**namespace/ (可省略)*/Task2_1();
echo \call_user_func_array([$obj,'sum'],[21,12]);
echo '<hr>';
//静态调用方法
class Task2_2
{
public static function sum($a,$b)
{
return "{$a}+{$b}=" . ($a+$b);
}
}
// ::class :返回一个带有命名空间的类名称
echo \call_user_func_array([Task2_2::class,'sum'],[34,13]);点击 "运行实例" 按钮查看在线实例
3. 实例演示方法重载的实现原理与参数获取方式

<?php
namespace _1014;
class Task3
{
// __call():访问一个不存在或无权限访问的方法的时候会自动调用
public function __call($name,$args)
{
return '方法是: '. $name. ', 参数列表: <pre>'. print_r($args, true);
}
// __callStatic():访问一个不存在或无权限访问的静态方法的时候会自动调用
public static function __callStatic($name,$args)
{
return '方法是: '. $name. ', 参数列表: <pre>'. print_r($args, true);
}
}
echo (new Task3())->get(11,22,33);
echo Task3:: staticGet(111,222,333);点击 "运行实例" 按钮查看在线实例
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)

<?php
namespace _1015;
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;
}
public function select() // 生成SQL语句
{
$sql='SELECT ' // 拼装SQL
.$this->field // 字段列表
.' FROM '
.$this->table //数据表
.$this->where //条件
.$this->limit; //显示数量
$stmt= $this ->pdo->prepare($sql); // 预处理
$stmt->execute();
// die($stmt ->debugDumpParams(0)); //查看生成的sql
return $stmt->fetchALL(\PDO::FETCH_ASSOC);
}
}点击 "运行实例" 按钮查看在线实例

<?php
namespace _1015;
require 'task4.php';
class DB
{
protected static $pdo = null; // 连接对象
public static function connection() // 数据库的连接方法
{
self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=test' , 'root','root' );
}
public static function __callStatic($name,$arguments)
{
self::connection() ; // 连接数据库
$query = new Query(self::$pdo); // 实例化查询类,将连接对象做为参数
return \call_user_func_array([$query,$name],$arguments);// 调用查询对象$query中的对应的方法
}
}
$task = DB::table ('task')
->field('task_id,name,position')
->where('task_id >2')
->limit(4)
->select();
foreach ($task as $t) {
\print_r($t);
echo '<br>';
}点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号