php 中的重载技术——解决调用对象(或类)的未定义的属性或方法出错问题

重载的基本概念:

重载在通常的“面向对象的语言”中的含义:是指在一个类(或对象)中,有多个名字相同但是形参不同的方法的现象;

如:class A{

function f1(){}

function f2($p1){}

function f3($p1,$p2){}

}


但是,重载在“PHP语言”中的含义有些不同:

“PHP语言”中的重载:是指当一个对象(或类)使用其未定义的属性或方法的时候,其中的一些处理机制;

如:class B{

public $p1 = 1 ;

}

$b1 = new B();

echo $b1 -> p2 ;//将会出错,报出未定义属性p2;

$b1 -> f1();//程序出错,停止执行,报出未定义的方法f1;

所以,PHP中的重载技术,就是来应对上述“出错”而阻止程序继续执行的情况,使代码不出错,而且还能优雅的处理。


PHP中的重载分为:属性重载和方法重载;

属性重载:就是对一个对象的不存在的属性进行使用的时候,这个类中预先设定好的应对办法(或处理机制);

方法重载:当对一个对象的不存在的实例方法进行“调用”的时候,会自动调用类中的__call()这个魔术方法;

    当对一个类的不存在的静态方法进行“调用”的时候,会自动调用类中的__callstatic()这个静态魔术方法;


针对当调用类的不存在的属性或方法的重载技术(或处理机制)如下:

class BaseController {

    /*这是一个魔术方法,当一个对象或者类获取其不存在的属性的值时,
    *如:$obj = new BaseController ;
     * $a = $obj -> a ;
    *该方法会被自动调用,这样做很友好,可以避免系统报错
    */
    public function __get($property_name){
        echo "属性 $property_name 不存在\n";
        //触发错误
        trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR);
    }

    /*这是一个魔术方法,当一个对象或者类给其不存在的属性赋值时,
    *如:$obj = new BaseController ;
     * $obj -> a = 12 ;
    *该方法(__set(属性名,属性值))会被自动调用,这样做很友好,可以避免系统报错
    */
    public function __set($property_name,$value){
        echo "属性 $property_name 不存在\n";
        //触发错误
        trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR);
    }

    /*这是一个魔术方法,当一个对象或者类的不存在属性进行isset()时,
    *注意:isset 用于检查一个量是否被赋值 如果为NULL会返回false
    *如:$obj = new BaseController ;
     * isset($obj -> a) ;
    *该方法会被自动调用,这样做很友好,可以避免系统报错
    */
    public function __isset($property_name){
        echo "属性 $property_name 不存在\n";
        //触发错误
        trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR);
    }

    /*这是一个魔术方法,当一个对象或者类的不存在属性进行unset()时,
    *注意:unset 用于释放一个变量所分配的内存空间
    *如:$obj = new BaseController ;
     * unset($obj -> a) ;
    *该方法会被自动调用,这样做很友好,可以避免系统报错
    */
    public function __unset($property_name){
        echo "属性 $property_name 不存在\n";
        //触发错误
        trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR);
    }

    /*当对这个类的对象的不存在的实例方法进行“调用”时,会自动调用该方法,
     * 这个方法有2个参数(必须带有的):
     * $methodName 表示要调用的不存在的方法名;
     * $argument 是一个数组,表示要调用该不存在的方法时,所使用的实参数据,
     * */
    public function __call($methodName,$argument){
        echo "实例方法 $methodName 不存在\n";
        //触发错误
        trigger_error("发生错误,$methodName 方法不存在。",E_USER_ERROR);
    }

    /*当对这个类的不存在的静态方法进行“调用”时,会自动调用该方法,
     * 这个方法有2个参数(必须带有的):
     * $methodName 表示要调用的不存在的方法名;
     * $argument 是一个数组,表示要调用该不存在的方法时,所使用的实参数据,
     * */
    public function __callstatic($methodName,$argument){
        echo "静态方法 $methodName 不存在\n";
        //触发错误
        trigger_error("发生错误,$methodName 方法不存在。",E_USER_ERROR);
    }

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值