1. Understand the definition of magic methods in PHP
2. Understand the usage scenarios of __call() magic method
3. Master the usage of __call() magic method
4. Understand the usage scenarios of __callStatic() magic method
5. Master the usage of __callStatic() magic method
PHP Reserve all class methods starting with __ (two underscores) as magic methods. Therefore, when defining class methods, except for the above magic methods, it is recommended not to prefix them with __.
There is another name for these two magic methods. They can also be called overloading of the method
In order not to report an error when calling a method that does not exist in a class, we can define _ in the class _call method, it will be automatically executed at this moment
Summary:
1. In PHP The format of __call defined in the class is as follows: public function __call (parameter 1, parameter 2). Note here that there must be 2 __, it must be __call, and it must take 2 parameters. One more and one less will not work.
2. When calling a method that does not exist, the system will automatically trigger the defined __call method of the class where the object is located
Each summary is obtained through practice. Now we Use practice to demonstrate the summary, which can promote understanding and make each summary clearer and more intuitive
##Case 1,
Practice goals:
1. In PHP, __call is defined in the class in the following format: public function __call (parameter 1, parameter 2). Note that it is necessary to It is 2 __, it must be __call, and it must take 2 parameters, one more or one less will not work
The specific code is as follows: Let’s take a look without parameters first
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔术方法 public function __call(){ echo "自动执行了Animal类中的__call方法<br/>"; } } $ani = new Animal(); ?>
The running results are as follows:
Fatal error: Method Animal::__call() must take exactly 2 arguments in D:\E -class\class-code\classing\index.php on line 15
Now write 2 parameters
<?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("猴子"); ?>
The running results are as follows:
Blank page, indicating that no error was reported, correct
Case 2.
Practice goals:
1. When calling a method that does not exist, the system will automatically trigger the defined __call method of the class where the object is located
Specific code As follows:
<?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(); ?>
The running result is:
The __call method in the Animal class is automatically executed
我们发现其实我们没有手动的去调用__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方法,它会在此刻被自动执行
1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行
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
1、本文主要讲了另外2个魔术方法,__call,__callStatic,讲了他们的使用场景以及具体的实现
希望本文能给大家带来一定的帮助,谢谢!!!
The above is the detailed content of Detailed explanation of PHP magic methods __call and __callStatic (code examples). For more information, please follow other related articles on the PHP Chinese website!