在PHP中的类中自动调用其他几种方法中的一种方法

时间:2017-10-07 11:32:15

标签: php class oop methods

我们假设这个课程:

<?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();感觉不对...

1 个答案:

答案 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