类中属性和方法的重载技术

原创 2018-11-28 19:47:12 312
摘要:重载技术(动态的创建类属性和方法 => 称为魔术方法); 属性重载1.__get($name.$value)2.__get($name)3.__inset($name)4.__unset($name)方法重载 1.__call($method,array $args)2.__callStatic($method,array $args)//这是require文件 <

重载技术(动态的创建类属性和方法 => 称为魔术方法);

 属性重载
1.__get($name.$value)
2.__get($name)

3.__inset($name)

4.__unset($name)

方法重载

 1.__call($method,array $args)

2.__callStatic($method,array $args)

12.png

//这是require文件
<?php
class Site
{
    public function show($arguments){
        $title = func_get_arg(0);
        $desc = func_get_arg(1);
        return 'Site::show():<br />站点名称'.$title.'<br />站点描述:'.$desc;
    }
    public static function add($arguments){
        $m = func_get_arg(0);
        $n = func_get_arg(1);
        return 'Site::add():'. $m . '+' . $n .'='. ($m+$n);
    }
}
//这些变量意思是是否能进行操作预设的。
const IS_ISSET = true;
const IS_GET = true;
const IS_SET = true;
const IS_UNSET = false;

class Visit
{
    protected  $data = [];
    //判断是否存在这个数据
    public function __isset($name)
    {
        return isset($this->data[$name]) ? true : false;
        //return IS_ISSET && isset($this->data[$name]);
    }
    //验证是否有就返回/否则返回'非法访问'
    public function __get($name)
    {
        return IS_GET ? $this->data[$name]:'非法访问';
    }
    //赋值
    public function __set($name,$value)
    {
        return IS_SET ? $this->data[$name] = $value : '禁止赋值';
    }
    //销毁
    public function __unset($name)
    {
        if (IS_UNSET){
            unset($this->data[$name]);
        }else{
            echo '销毁失败';
        }
    }
}

$test = new Visit();
//判断类是否有这个属性,没就自己赋值
if(isset($test->table)){
    echo $test->table.'11<br/>';
}else{
    $test->table = '员工表';
}
//访问
echo $test->table.'<br/>';

//更新赋值
$test->table = '工作表';
//访问
echo $test->table.'<br/>';

//销毁
unset($test->table);
//访问
echo $test->table.'<br/>';

/*
 * 方法重载
 * __call(),__callStatic()
 *
 * call_user_func_array([(new 某类),'方法'],$arguments)
 */

require 'public/Site.php';
class Web
{
    //当访问不存在方法会自动调用
    public function __call($name, $arguments)
    {
        //return '方法名字:'.$name.'参数为:'.var_export($arguments,true);
        //方法重载多用在跨类的方法上调用
        return call_user_func_array([(new Site),'show'],$arguments);
    }
    public static function __callStatic($name, $arguments)
    {
        //跨类调用静态方法
        return call_user_func_array([(new Site),'add'],$arguments);
    }
}

$web = new Web();
//访问不存在方法
echo $web->show('11','22'),'<hr >';

//访问不存在静态方法
echo Web::add(30,30);

批改老师:天蓬老师批改时间:2018-11-28 23:58:59
老师总结:没有示例代码, 不直观! 类成员主要是属性和方法,所有重载主要针对他们的,以及检测方法,也很好记忆

发布手记

热门词条