Reputation: 4582
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?
Upvotes: 0
Views: 130
Reputation: 24435
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?)
Upvotes: 3