我们假设这个课程:
<?php
namespace app;
class SimpleClass {
protected $url = '';
protected $method = 'GET';
public function __construct( $url, $method = 'GET' )
{
$this->url = $url;
$this->method = $method;
}
public function get()
{
$this->prepare_something();
// other things...
}
public function post()
{
$this->prepare_something();
// other things...
}
public function patch()
{
$this->prepare_something();
// other things...
}
public function put()
{
// other things...
}
public function delete()
{
// other things...
}
protected function prepare_something()
{
// preparing...
}
正如您在本课程中可以看到的三种方法; get, post, patch
我们使用方法preparing_something
,但在方法put, delete
中我们没有。{/ p>
我不得不重复3次$this->prepare_something();
。这三种方法中的一次get, post, patch
。在这3种方法的开头,它是3 lines
相同的调用。
但想象一下,我们有100种方法。
其中70个我们使用$this->prepare_something();
而30个我们没有。{/ p>
在这70种方法中有没有办法auto-call
这些方法?没有写出这70种方法中的每一种$this->prepare_something();
?
这只是痛苦而且在某些方法中必须同时调用相同方法$this->prepare_something();
感觉不对...
答案 0 :(得分:2)
使用魔术方法__call()
__call()
- 无论何时调用不可访问的方法,都会调用__call
,因此这不适用于公共方法,您必须至少重命名为受保护。参考:http://php.net/manual/en/language.oop5.magic.php
public function __call($method,$args)
{
// if method exists
if(method_exists($this, $method))
{
// if in list of methods where you wanna call
if(in_array($method, array('get','post','patch')))
{
// call
$this->prepare_something();
}
return call_user_func_array(array($this,$method),$args);
}
}
请注意:这不适用于
public
方法,这是结果。
测试结果:
akshay@db-3325:/tmp$ cat test.php
<?php
class Test {
public function __call($method,$args)
{
// if method exists
if(method_exists($this, $method))
{
// if in list of methods where you wanna call
if(in_array($method, array('get','post','patch')))
{
// call
$this->prepare_something();
}
return call_user_func_array(array($this,$method),$args);
}
}
protected function prepare_something(){
echo 'Preparing'.PHP_EOL;
}
// private works
private function get(){
echo 'get'.PHP_EOL;
}
// protected works
protected function patch(){
echo 'patch'.PHP_EOL;
}
// public doesn't work
public function post(){
echo 'post'.PHP_EOL;
}
}
$instance = new test;
// protected works
$instance->prepare_something();
// private works
$instance->get();
// protected works
$instance->patch();
// public does not work
$instance->post();
?>
<强>执行:强>
akshay@db-3325:/tmp$ php test.php
Preparing
Preparing
get
Preparing
patch
post