类种的属性和方法的重载

原创 2018-12-01 16:59:48 211
摘要:<?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()时自动调用

方法重载

  1. __call($method,array $args):访问对象中不可访问的方法时,自动调用

  2. __callStatic($method,array $args):在静态上下文中调用一个不可访问方法时调用

批改老师:韦小宝批改时间:2018-12-01 17:50:48
老师总结:不错不错!写的很完整!课后还要记得多多练习哦!继续加油吧!!

发布手记

热门词条