PHP仅为原始函数

时间:2017-08-27 06:50:39

标签: php

您好,欢迎来到我的第一个官方问题!我试图覆盖一个函数,但只是某些部分。我想要覆盖的功能在开源CMS系统的几个版本中是不同的。为了使其工作,我需要更改的具体部分在所有这些版本中都是相同的。

覆盖必须与所有这些不同版本的CMS系统一起使用。

我不能使用PECL(apd)包或任何其他外部PHP包。就目前为止我所知道并且可以在PHP手册中找到,没有这方面的功能。

所以,例如:

我们有不同的CMS系统版本:1,2和3。

我们将拥有这样的原始功能(这只是一个例子而不是我需要改变的实际功能),它只能用于版本3.某些部件在所有版本中都是相同的,有些部件是相同的是不同的:

public function createAccessToken($body = false)
    {
        if (!$body) { //this is different
            $body = 'grant_type=client_credentials'; //this is different
        }
        $this->action = 'POST'; //this is different
        $this->endpoint = 'v1/oauth2/token'; //this is different
        $response = $this->makeCall($body, "application/json", true); //this is different
        if (!isset($response->access_token)) { //this is THE SAME
            return false; //this is THE SAME
        }
        $this->token = $response->access_token; //this is different
        return true; //this is different
    }

这就是我想要为所有这些版本更改的内容:

public function createAccessToken($body = false)
    {
        if (!$body) {
            $body = 'grant_type=client_credentials';
        }
        $this->action = 'POST';
        $this->endpoint = 'v1/oauth2/token';
        $response = $this->makeCall($body, "application/json", true);
        if (isset($response->access_token)) { //IT'S CHANGED! THE -> ! IS GONE
            return false;
        }
        $this->token = $response->access_token;
        return true;
    }

但上述功能(已更改)仅适用于CMS系统的第3版。

因此,有什么方法我只能覆盖我需要更改的特定部分,并“获取”不必改变其他方式的代码,以便仍然可以执行该功能?再说一次:

public function createAccessToken($body = false)
    {
        //some way to get the code above the part i need to change, untill i get to the part which needs to be changed. So the override "takes over" from here.

        if (isset($response->access_token)) { //IT'S CHANGED! THE -> ! IS GONE
            return false;
        }
        //some way to get the rest of the code and have the function continue agian
    }

希望你能帮助我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以创建自己的中间层。这假设您可以访问一些定义当前VERSION的变量。

public function createAccessToken($body = false) {
   if (VERSION == 1 || VERSION == 2) { createAccessTokenOld($body); }
   else { createAccessTokenNew($body); }
}

public function createAccessTokenOld($body = false)
{
    if (!$body) {
        $body = 'grant_type=client_credentials';
    }
    $this->action = 'POST';
    $this->endpoint = 'v1/oauth2/token';
    $response = $this->makeCall($body, "application/json", true);
    if (!isset($response->access_token)) { //IT'S CHANGED! THE -> ! IS GONE
        return false;
    }
    $this->token = $response->access_token;
    return true;
}

public function createAccessTokenNew($body = false)
{
    if (!$body) {
        $body = 'grant_type=client_credentials';
    }
    $this->action = 'POST';
    $this->endpoint = 'v1/oauth2/token';
    $response = $this->makeCall($body, "application/json", true);
    if (isset($response->access_token)) { //IT'S CHANGED! THE -> ! IS GONE
        return false;
    }
    $this->token = $response->access_token;
    return true;
}

您还可以使用更多代码重用来实现:

public function createAccessToken($body = false) {
   if (VERSION == 1 || VERSION == 2) { createAccessToken($body, true); }
   else { createAccessToken($body, false); }
}

public function createAccessToken($body = false, $isOld = false)
{
    if (!$body) {
        $body = 'grant_type=client_credentials';
    }
    $this->action = 'POST';
    $this->endpoint = 'v1/oauth2/token';
    $response = $this->makeCall($body, "application/json", true);

    if ($isOld) { if (!isset($response->access_token)) { return false; } }
    else { if (isset($response->access_token)) { return false; } }

    $this->token = $response->access_token;
    return true;
}