PHP 在 class 中重用函数代码

PHP Reusing function code within a class

PHP - 在 Class

中重用代码

我有一个 PHP class 用于使用 REST API。我有一些方法可以从 API 获取 return 基本信息 - 但大部分数据来自单个 API 调用。

例如,假设我们引用 API 来获取汽车模型:

汽车API

http://cars.com/webservice/getCars.jsp?ALL

此请求(顺便说一句,不是真正的网络服务)将 return 所有汽车。

假设我想要一份所有配备 V6 发动机的汽车的清单。假设这是 NOT API.

的函数

合乎逻辑的做法是检索所有汽车,根据条件进行过滤,然后return我们要查找的内容。

现在......假设我们想要一堆关于汽车的不同细节 - 车轮、刹车、火花塞等。重复相同的代码来检索汽车的初始列表是没有意义的。

class Cars {
public function getCars() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output; 
}

public function getCarEngines($type) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    //Get Engines from list of cars
    return $output['engines'][$type];
}   
}   

我如何有效地复制我的代码以便我可以提供额外的方法同时最小化代码行数?

首先,您可以将特定于 cURL 的功能移动到它自己的可以重复使用的函数中,如下所示:

class Cars {
    public function getCars() {
        $output = $this->curlRequest($url);
        return $output; 
    }

    public function getCarEngines($type) {
        $output = $this->curlRequest($url);
        //Get Engines from list of cars
        return $output['engines'][$type];
    }   

    /**
     * Return the result of a cURL request.
     * @param  string $url
     * @return mixed
     */
    protected function curlRequest($url) 
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);

        return $output;
    }
}   

根据您的数据结构,您可以更进一步,说当您 getCarEngines() 时,您将首先 getCars(),然后过滤输出(如果适用),你可以这样做:

public function getCars() {
    return $this->curlRequest($url); 
}

public function getCarEngines($type) {
    $output = $this->getCars();
    // Get Engines from list of cars
    return $output['engines'][$type];
}   

仅供参考 - 我忽略了以下事实:$url 变量未在您的示例中的任何位置定义,并且您没有随 cURL 请求传递任何数据。您需要将 $data 变量添加到 curlRequest() 函数中,以便在需要时也能够传递数据,并从某处获取 $url(class 属性?)