PHP魔术方法之__get,__set详解(代码实例)-php教程

资源魔 34 0

本文指标:

一、理解PHP中魔术办法的界说

二、理解__get()魔术办法的应用场景

三、把握__get()魔术办法的用法

四、理解__set()魔术办法的应用场景

五、把握__set()魔术办法的用法

(一)、理解PHP中魔术办法的界说

PHP 将一切以 __(两个下划线)扫尾的类办法保存为魔术办法。以是正在界说类办法时,除了了上述魔术办法,倡议没有要以 __ 为前缀。

这2个魔术办法,另有个叫法,还能够称作属性重载的魔术办法

(二)、理解__get()魔术办法的应用场景

当心愿拜访某个工具的不决义的或许不成拜访的属性没有报错,咱们能够正在类里界说__get办法,这样零碎正在此刻会主动挪用该办法

(三)、把握__get()魔术办法的用法

总结:

一、PHP中__get的界说格局以下:public function __get(参数1) ,这里留意必需是2个__,称号必需是__get,并且必需是要带1个参数,多一个少一个都没有行

二、当挪用没有存正在的属性时,零碎会主动触发工具所正在类的界说好的__get办法

每一个总结都是经过理论患上进去的,如今咱们用理论来演示总结,这样能够促成了解,让每一个总结了解起来愈加明晰,直观

案例1、

理论指标:

一、PHP中__get的界说格局以下:public function __get(参数1) ,这里留意必需是2个__,称号必需是__get,并且必需是要带1个参数,多一个少一个都没有行

详细代码以下:

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    // static public function staticFun(){
    //     echo "Animal中的staticFun执行了<br/>";
    // }
    //魔术办法  
    public  function __get($name){
        echo "主动执行了Animal类中的__get办法,以后属性为:{$name}<br/>";
    }
}
$ani = new Animal();
?>

运转后果为:

未报错,阐明语法正确

如今咱们 多加个参数看下

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    // static public function staticFun(){
    //     echo "Animal中的staticFun执行了<br/>";
    // }
    //魔术办法  
    public  function __get($name,$arg){
        echo "主动执行了Animal类中的__get办法,以后属性为:{$name}<br/>";
    }
}
$ani = new Animal();
$name = $ani->name;
?>

运转后果为:

Fatal error: Method Animal::__get() must take exactly 1 argument in D:\E-class\class-code\classing\index.php on line 14

以是从后果能够看出,参数有且只能有一个,多一个少一个都没有行

案例2、

理论指标:

一、当挪用没有存正在的属性时,零碎会主动触发工具所正在类的界说好的__get办法

详细代码以下:

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    // static public function staticFun(){
    //     echo "Animal中的staticFun执行了<br/>";
    // }
    //魔术办法  
    public  function __get($name){
        echo "主动执行了Animal类中的__get办法,以后属性为:{$name}<br/>";
    }
}
$ani = new Animal();
$name = $ani->name;
?>

运转后果以下:

主动执行了Animal类中的__get办法,以后属性为:name

咱们发现其实咱们不手动的去挪用__get办法,就是说不写成$ani->__get(),然而这个办法仍然执行了,由于甚么呢?由于咱们写了$ani->name;而这个name办法不正在类中界说,而后这个类中又界说了这个魔术办法,以是它就像魔术同样,忽然就被主动执行了,并且咱们__get中的参数就是这个属性

这里肯定要留意,是2个下划线,没有是一个,不然就没有是魔术办法了,上面仍是再来做下测试

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    // static public function staticFun(){
    //     echo "Animal中的staticFun执行了<br/>";
    // }
    //魔术办法  试着少写一个_
    public  function _get($name){
        echo "主动执行了Animal类中的__get办法,以后属性为:{$name}<br/>";
    }
}
$ani = new Animal();
$name = $ani->name;
?>

运转后果以下:

Notice: Undefined property: Animal::$name in D:\E-class\class-code\classing\index.php on line 18

以是此刻就会报错了,由于不__get的魔术办法了,以是肯定要留意是2个下划线,就如同结构函数以及析构函数同样,都是两个下划线

(四)、理解__set()魔术办法的应用场景

当为工具没有存正在的属性赋值时,会主动挪用类中界说好的__set办法

(五)、把握__set()魔术办法的用法

总结:

一、PHP中__set正在类中界说格局以下 public function __set(属性参数1,属性对应的值的参数2),这里留意必需是2个__,称号必需是__set,并且必需是要带2个参数,多一个少一个都没有行

二、当设置没有存正在的属性时,零碎会主动触发工具所正在类的界说好的__set办法

每一个总结都是经过理论患上进去的,如今咱们用理论来演示总结,这样能够促成了解,让每一个总结了解起来愈加明晰,直观

案例1、

理论指标:

一、PHP中__set正在类中界说格局以下 public function __set(属性参数1,属性对应的值的参数2),这里留意必需是2个__,称号必需是__set,并且必需是要带2个参数,多一个少一个都没有行

详细代码以下:

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法  
    public  function __set($name,$val){
        echo "主动执行了Animal类中的__set办法,以后属性为:{$name},值为:{$val}<br/>";
    }
}
$ani = new Animal();

?>

运转后果为:

空缺,阐明不报错

接上去,咱们少一个参数看下

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法  
    public  function __set($name){
        echo "主动执行了Animal类中的__set办法,以后属性为:{$name},值为:{$val}<br/>";
    }
}
$ani = new Animal();

?>

运转后果为:

Fatal error: Method Animal::__set() must take exactly 2 arguments in D:\E-class\class-code\classing\index.php on line 11

以是__set办法的参数有且只能是2个,一个是属性名,一个是属性要设置的值

案例2、

理论指标:

一、当设置没有存正在的属性时,零碎会主动触发工具所正在类的界说好的__set办法

详细代码以下:

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法  
    public  function __set($name,$val){
        echo "主动执行了Animal类中的__set办法,以后属性为:{$name},值为:{$val}<br/>";
    }
}
$ani = new Animal();
$ani->name = "小狗";

?>

运转后果为:

主动执行了Animal类中的__set办法,以后属性为:name,值为:小狗

咱们发现其实咱们不手动的去挪用__set办法,也就是说不写成$ani->__set(),然而这个办法仍然执行了,由于甚么呢?由于咱们写了$ani->name = "小狗";;这个name属性正在类中不界说,而后这个类中又界说了这个魔术办法,以是它就像魔术同样,忽然就被主动执行了

这里肯定要留意,是2个下划线,没有是一个,不然就没有是魔术办法了,上面仍是再来做下测试

详细代码以下:

<?php
class Animal{
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法  试着少写一个_
    public  function _set($name,$val){
        echo "主动执行了Animal类中的__sett办法,以后属性为:{$name},值为:{$val}<br/>";
    }
}
$ani = new Animal();
$ani->name = "小狗";

?>

运转后果以下:

空缺了

以是阐明不执行__set魔术办法了,以是肯定要记患上是两个__

(六)、总结

一、本文次要讲了另外2个魔术办法,__get,__set,讲了他们的应用场景和详细的完成

心愿本文能给各人带来肯定的协助,谢谢!!!

以上就是PHP魔术办法之__get,__set详解(代码实例)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 魔术方法

抱歉,评论功能暂时关闭!