且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

回顾php魔术方法__call(),__callStatic()

更新时间:2022-09-16 11:13:20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
declare(strict_types=1);//开启强类型模式
 
//不可访问的方法:private/protected/不存在的方法
 
class Person{
    public function say(){
        echo "Hello world";
        echo "\r\n";
    }
}
 
(new Person())->say();//调用类中存在的方法
 
(new Person())->eat('food');//调用类中不可访问的方法


1
2
3
4
5
调用类中不存在的方法
PHP Fatal error:  Uncaught Error: Call to undefined method Person::eat() in /home/zrj/www/zhangrenjie_test/test/36.php:26
Stack trace:
#0 {main}
  thrown in /home/zrj/www/zhangrenjie_test/test/36.php on line 26



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Person
{
    public function say()
    {
        echo "Hello world";
        echo "\r\n";
    }
 
    // 在对象中调用一个不可访问方法时,__call() 会被调用。
    public function __call($functionName$arguments)
    {
        echo "您调用了类中不存在的方法:" $functionName "\r\n";
        echo "接受的参数为:" . print_r($arguments, true);
    }
}
 
 
(new Person())->say();
 
(new Person())->eat('food''chicken''bull');


Hello world

您调用了类中不存在的方法:eat

接受的参数为:Array

(

    [0] => food

    [1] => cocal

    [2] => bull

)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Person
{
 
    public function __call(string $namearray $arguments)
    {
        echo "Call not exists dynamic method :" $name "\r\n";
        echo $name " : " $arguments[0] . "\r\n\r\n";
    }
 
    /**  PHP 5.3.0之后版本  */
    public static function __callStatic(string $namearray $arguments)
    {
        echo "Call not exists static method :" $name "\r\n";
        echo $name " : " $arguments[0] . "\r\n\r\n";
    }
}
 
(new Person())->say('hello world');
 
(new Person())->__call('say', ['hello world']);
 
 
Person::do('coding php');
 
Person::__callStatic('do', ['coding java']);


Call not exists dynamic method :say
say : hello world

Call not exists dynamic method :say
say : hello world

Call not exists static method :do
do : coding php

Call not exists static method :do
do : coding java










本文转自 hgditren 51CTO博客,原文链接:http://blog.51cto.com/phpme/1982125,如需转载请自行联系原作者