10月8日作业
1. 实例演示四个属性重载的魔术方法的使用方式
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
3. 实例演示方法重载的实现原理与参数获取方式
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
属性重载魔术方法的使用 : __get(), __set(), __isset(), __unset()
<?php
namespace moshu;
//属性重载魔术方法的使用 __get(), __set(), __isset(), __unset()
// 魔术方法: 不需要或不允许用户调用,由系统来调用,
class Demo
{
public $age;
private $name; //私有的属性 名字
private $salary; //私有的属性 工资
protected $secert = 'PHP中文网的朱老师和猪哥不是同一个人'; //受保护的属性
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
//__get()魔术方法是读操作,重载用户对属性的访问
public function __get($a)
{
return $this->$a;
}
//__set($name,$value)魔术方法,写操作
public function __set($name, $value)
{
return $this->$name = $value;
}
//__isset($name),__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
public function __isset($name)
{
echo('我被调用了');
return isset($this->$name);
}
public function __unset($name)
{
echo('我被调用了删除操作');
unset($this->$name); //unset()方法没有返回值.
}
}
$obj = new Demo('朱老师', 9999);
echo $obj->name.'<br>';
echo $obj->salary.'<br>';
echo $obj->secert.'<br>';
//是私有属性,类外部不能直接访问,当使用__get();方法重载后,可以输出变量了
//设置$name为欧阳老师
$obj->name = '欧阳老师';
//如果没有用到__set()方法重载,会报错
//Fatal error: Uncaught Error: Cannot access private property moshu\Demo::$name
echo $obj->name.'<br>';
echo isset($obj->obj)? '属性存在' : '属性不存在';
echo('<hr>');
echo empty($obj->secert)? '属性不存在' : '属性存在';
echo('<hr>');
//访问到了公共属性,__isset()不被调用
echo isset($obj->age)? '属性存在' : '属性不存在';
echo('<hr>');
unset($obj->name);
echo($obj->name);
//删除私有属性后,不能访问
//Notice: Undefined property: moshu\Demo::$name
?>点击 "运行实例" 按钮查看在线实例

call_user_func_array()回调执行函数/对象/类的方法的流程与方式
<?php
namespace func;
function sum ($a, $b){
return "{$a} + {$b} = ".($a+$b).'<br>';
}
//回调执行函数的方式
echo call_user_func('\func\sum',30,40);
echo call_user_func(__NAMESPACE__.'\sum',10,20);
echo call_user_func_array(__NAMESPACE__.'\sum',[30,50]);
//回调执行对象\类的方法的方式
class Test {
public function sum ($a, $b){
return "{$a} + {$b} = ".($a+$b).'<br>';
}
public static function sum2 ($a, $b){
return "{$a} + {$b} = ".($a+$b).'<br>';
}
}
//实例化类
$obj = new Test();
echo call_user_func_array([$obj,'sum'],[30,60]);
echo call_user_func_array([new Test(),'sum'],[30,60]);
echo '<hr>';
//调用类里面的静态方法
echo call_user_func_array(__NAMESPACE__.'\Test::sum2',[40,60]);
//::class , 返回一个带有命名空间的类名称
echo Test::class.'<br>';
//使用::class后面跟的是静态方法
echo call_user_func_array([Test::class,'sum2'],[50,60]);
?>点击 "运行实例" 按钮查看在线实例

实例演示方法重载的实现原理与参数获取方式
<?php
namespace func2;
//方法重载
class Test2 {
// __call(): 访问一个不存在或无权限访问的方法的时候会自动调用
//$name 方法名
//$args 参数数组
public function __call($name, $args){
return '调用的方法'.$name.'不存在<br>参数<pre>'.print_r($args,true);
}
//静态方法重载
public function __callStatic($name, $args){
return '调用的方法'.$name.'不存在<br>参数<pre>'.print_r($args,true);
}
}
$obj = new Test2();
echo $obj->name('朱老师',29);
echo '<hr>';
echo Test2::name('欧阳老师',18);
?>点击 "运行实例" 按钮查看在线实例

数据库链接调用
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号