dounanyin3179 2015-01-15 21:50
浏览 10
已采纳

PHP重用类中的函数代码

PHP - Reuse Code within a Class

I have a PHP class for working with a REST API. I have a few methods to return basic information from the API - but most of the data comes from a single API call.

For example, let's assume that we are referring to an API to get models of cars:

CAR API

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

This request (not a real webservice btw) would return ALL cars.

Let's say I want to a list of ALL of the cars with V6 engines. Let's say that this iS NOT a function of the API.

The logical thing to do would be to retrieve ALL of the cars, filter based on the criteria, and then return what we're looking for.

Now...let's say we want a BUNCH of different details about cars - wheels, brakes, spark plugs, etc. It wouldn't make sense to repeat the same code to retrieve the initial list of cars.

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];
}   
}   

How do I effectively replicate my code so I can offer additional methods while minimizing lines of code?

  • 写回答

1条回答 默认 最新

  • drnxnbf199049 2015-01-15 21:55
    关注

    To start with, you could move the cURL specific functionality into its own function which can be re-used, something like this:

    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;
        }
    }   
    

    Depending on your data structure, you could go another step further by saying that when you getCarEngines(), you're going to getCars() first, then filter the output (if that applies), and you could do something like this:

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

    FYI - I'm ignoring the fact that the $url variable isn't defined anywhere in your example and that you aren't passing any data along with your cURL request. You'll need to add a $data variable into the curlRequest() function to be able to pass data too if you need to, and get $url from somewhere (a class property?)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP