PHP魔术方法之__call和__callStatic详解(代码实例)-php教程

资源魔 27 0

本文指标:

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

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

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

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

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

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

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

这2个魔术办法,另有个叫法,还能够称作办法的重载(overloading)

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

为了正在挪用一个类中没有存正在的办法时没有报错,咱们能够正在类中界说__call办法,它会正在此刻被主动执行

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

总结:

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

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

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

案例1、

理论指标:

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

详细代码以下:先没有带参数看下

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

    }
    public function sleep(){

    }
    //魔术办法 
    public  function __call(){
        echo "主动执行了Animal类中的__call办法<br/>";
    }
}
$ani = new Animal();

?>

运转后果以下:

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

如今写上2个参数

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法 
    public function __call($name,$args){
        echo "主动执行了Animal类中的__call办法<br/>";
    }
}
$monkey = new Animal("山公");

?>

运转后果以下:

空缺页面,阐明没报错,正确


案例2、

理论指标:

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

详细代码以下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法 
    public function __call($name,$args){
        echo "主动执行了Animal类中的__call办法<br/>";
    }
}
$monkey = new Animal("山公");
//挪用没有存正在的办法
$monkey->test();
?>

运转后果为:

主动执行了Animal类中的__call办法

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

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

详细代码以下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    //魔术办法 试着少写一个_看下
    public function _call($name,$args){
        echo "主动执行了Animal类中的__call办法<br/>";
    }
}
$monkey = new Animal("山公");
//挪用没有存正在的办法
$monkey->test();
?>

运转后果为:

Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:20 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 20

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


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

为了正在挪用一个类中没有存正在的动态办法时,没有报错,咱们能够正在类中界说__callStatic办法,它会正在此刻被主动执行

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

一、PHP中__callStatic正在类中界说格局以下 static public function __callStatic(参数1,参数2),这里留意必需是2个__,必需是__callStatic,并且必需是要带2个参数,多一个少一个都没有行

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

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

案例1、

理论指标:

一、PHP中__callStatic正在类中界说格局以下 static public function __callStatic(参数1,参数2),这里留意必需是2个__,必需是__callStatic,并且必需是要带2个参数,多一个少一个都没有行

详细代码以下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    static public function staticFun(){
        echo "Animal中的staticFun执行了<br/>";
    }
    //魔术办法
    static public  function __callStatic($name,$args){
        echo "主动执行了Animal类中的__callStatic办法<br/>";
    }
}
//挪用没有存正在的动态办法
Animal::staticFun();
Animal::test();
?>

运转后果以下:

Animal中的staticFun执行了
主动执行了Animal类中的__callStatic办法

咱们发现其实咱们不手动的去挪用__callStatic办法,也就是说不写成Animal::__callStatic(),然而这个办法仍然执行了,由于甚么呢?由于咱们写了Animal::test();这个动态办法正在类中没有存正在,而后这个类中又界说了这个魔术办法,以是它就像魔术同样,忽然就被主动执行了

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

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    static public function staticFun(){
        echo "Animal中的staticFun执行了<br/>";
    }
    //魔术办法 试着少写一个
    static public  function _callStatic($name,$args){
        echo "主动执行了Animal类中的__callStatic办法<br/>";
    }
}
//挪用没有存正在的动态办法
Animal::staticFun();
Animal::test();
?>

运转后果以下:

Animal中的staticFun执行了

Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:23 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 23

以是此刻就会报错了,由于不__callStatic的魔术办法了,以是肯定要留意是2个下划线,就如同结构函数以及析构函数同样,都是两个下划线,并且肯定要记患上这个魔术办法自身就是static动态办法,不然也没有会对

首要的货色咱们仍是用代码理论一下:

<?php
class Animal{
    public $name = "";
    public function __construct($name){
        $this->name = $name;
    }
    public function eat(){

    }
    public function sleep(){

    }
    // static public function staticFun(){
    //     echo "Animal中的staticFun执行了<br/>";
    // }
    //魔术办法  试着少写static
    public  function __callStatic($name,$args){
        echo "主动执行了Animal类中的__callStatic办法<br/>";
    }
}
//挪用没有存正在的动态办法
// Animal::staticFun();
Animal::test();
?>

运转后果为:

Warning: The magic method __callStatic() must have public visibility and be static in D:\E-class\class-code\classing\index.php on line 17
主动执行了Animal类中的__callStatic办法

以是肯定要留意,__callStatic自身就是动态办法,没有要少写static

(六)、总结

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

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

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

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

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