摘要:<?php class Demo { protected $data = []; public function __isset($name) { //  
<?php
class Demo
{
protected $data = [];
public function __isset($name)
{
// return isset($this->data[$name]) ? true : false;
return isset($this->data[$name]);
}
public function __get($name)
{
return 1 ? $this->data[$name] : '非法访问';
}
public function __set($name, $value)
{
$this->data[$name] = $value;
}
public function __unset($name)
{
unset($this->data[$name]);
}
public function showData(){
return $this->data;
}
}
$demo = new Demo();
//类外部访问属性前,先进行检测
if (isset($demo->att)) {
echo $demo->att, '<br>';
} else {
$demo->att = 'att_1';
}
//访问 $att
echo $demo->att, '<br>';
//赋值或更新
$demo->att = 'att_2';
echo $demo->att, '<br>';
if (isset($demo->att)) {
unset($demo->att);
}
if (isset($demo->att)) {
echo $demo->att, '<br>';
} else {
echo '没这个属性,新增"att_new"<br>';
$demo->att = 'att_new';
}
echo '新值:',$demo->att, '<br>';
echo '<pre>',var_export($demo,1),'</pre><br>';
echo '<pre>',var_export($demo->showData(),1),'</pre>';
echo '<hr>';
class Show
{
public function see($arguments)
{
$title = func_get_arg(0);
$desc = func_get_arg(1);
return 'Show::see():<br>姓名'.$title.'<br>绝招:'.$desc;
}
public static function add($arguments)
{
$m = func_get_arg(0);
$n = func_get_arg(1);
return 'Show::add():<br>'.$m.' + '.$n.' = '.($m+$n);
}
}
class Web
{
public function __call($method, $arguments)
{
//方法重载更多的用在跨类的方法调用上,将这个魔术方法当做跳板
return call_user_func_array([(new Show),'see'],$arguments);
}
//当访问一个不存在或不可访问的静态方法时自动调用
public static function __callStatic($name, $arguments)
{
// 跨类静态调用一个静态方法
return call_user_func_array(['Show','add'],$arguments);
}
}
//实例化
$web = new Web();
//访问一个不存在的动态方法
echo $web->see('欧阳锋','蛤蟆功'), '<hr>';
//访问一个不存在的静态方法
echo Web::add(10,20);运行结果:
att_1
att_2
没这个属性,新增"att_new"
新值:att_new
Demo::__set_state(array(
'data' =>
array (
'att' => 'att_new',
),
))
array (
'att' => 'att_new',
)
Show::see():
姓名欧阳锋
绝招:蛤蟆功Show::add():
10 + 20 = 30
重载: 动态的创建类属性和方法
1.主要是通过魔术方法来实现
2.魔术方法的调用者是系统
3.魔术方法不能引用传参
4.重载根据类成员不同,分为属性重载与方法重载
属性重载
1.__set($name,$value):当给不可访问属性赋值时自动调用
2.__get($name):当访问不可访问属性的值时自动调用
3.__isset($name):当对不可访问属性调用isset()或empty()时自动调用
4.__unset($name):当对不可访问属性调用unset()时自动调用
方法重载
__call($method,array $args):访问对象中不可访问的方法时,自动调用
__callStatic($method,array $args):在静态上下文中调用一个不可访问方法时调用
批改老师:韦小宝批改时间:2018-12-01 17:50:48
老师总结:不错不错!写的很完整!课后还要记得多多练习哦!继续加油吧!!