PHP中的魔法函数 “__call” 在ThinkPHP中的妙用
PHP 中的 __call
方法在 ThinkPHP 中被广泛使用,用于处理未定义的方法调用。在 ThinkPHP 中,__call
方法通常用于实现类似于 _post
和 _get
方法的功能,即获取 $_POST
或 $_GET
数组中的数据。
1. __call
方法的定义
在 ThinkPHP 中,__call
方法通常定义在控制器类中,用于处理未定义的方法调用。例如:
1 |
|
我们以GET和POST为例,写一个相对完整的例子:
以下是一个使用 __call
实现类似功能的示例:
1 |
|
在上述示例中,__call
方法用于处理未定义的方法调用。当调用未定义的方法时,会根据方法名的前缀判断是获取 $_POST
还是 $_GET
数据,然后进行相应的处理。如果方法名不符合预期,会触发一个错误。
需要注意的是,__call
方法的实现可能会因具体的需求而有所不同。在实际应用中,你可能需要根据项目的具体情况来调整 __call
方法的实现。
2. _post
和 _get
方法的实现
在 ThinkPHP 中,_post
和 _get
方法通常用于获取 $_POST
和 $_GET
数组中的数据。
如果不考虑魔法函数__call,对于这两个函数的实现方式如下:
1 |
|
而我们实现这两个函数,还会考虑对GET和POST参数值的过滤,以及默认值的设置。标准的 ThinkPHP 3.1.2 较新的版本里,_post
和 _get
方法定义于 ThinkPHP/Library/Think/Controller.class.php
文件中,代码如下:
1 |
|
这些方法借助调用 input
方法从 $_POST
或 $_GET
数组中获取数据,同时支持数据过滤和默认值设置。
3. __call
实现原理
基于以上代码,我们不难发现,__call有以下这些规则:
- 触发条件:当调用一个对象中不存在的方法时,PHP 会自动调用该对象的
__call
方法。 - 参数传递:
__call
方法接收两个参数,$method
表示调用的方法名,$args
表示传递给该方法的参数数组。 - 方法处理:在
__call
方法中,可以根据方法名和参数来实现相应的逻辑。例如,在上述示例中,根据方法名的前缀判断是获取$_POST
还是$_GET
数据,然后进行相应的处理。
4. 用魔法战胜魔法
跟 __call 这个魔法函数类似,ThinkPHP 3.1.2中我们实现EmptyAction.class.php,即找不到对应的Action或者Controller的时候,代码逻辑走到这里。于是,EmptyAction.class.php
这个特殊的类就出现了。当系统找不到对应的 Action
或者 Controller
时,代码逻辑就会走到这里。
实现原理
ThinkPHP 框架在接收到请求后,会依据请求的 URL 来查找对应的 Controller
和 Action
。若找不到匹配的 Controller
或者 Action
,框架就会尝试调用 EmptyAction.class.php
中的方法。
使用方法
要使用 EmptyAction.class.php
,你需要在项目的 Lib/Action
目录下创建这个文件,并且定义一个继承自 Action
的 EmptyAction
类。
代码示例
以下是 EmptyAction.class.php
的一个简单示例:
1 |
|