呼び出しているメソッド/関数(クラス内)があり、idまたはurlのいずれかを渡したい。次に、メソッドはmysqlWHEREクエリでこれらの引数の1つを使用します。どちらか一方しか使用できません。
2つの引数のいずれかを要求するにはどうすればよいですか?つまり、2つの引数のうち1つだけをオプションにするにはどうすればよいですか?
両方の引数をオプションにして、いくつかのif elseステートメントを使用するよりも良い方法はありますか?
文字通り引数が必要な場合:
public function fetchRow($where)
{
if (empty($where['id']) && empty($where['url'])) {
throw new Exception('WHERE clause must be supplied');
}
// proxy to specific method
if (!empty($where['id'])) {
return $this->fetchById((int) $where['id']);
} elseif (!empty($url)) {
return $this->fetchByUrl((string) $where['url']);
}
}
public function fetchById($id)
{
if ($stmt = $mysqli->prepare('SELECT * FROM table WHERE id = ?')) {
$stmt->bind_param('i', $id);
// ...
}
}
// ...
$object = new MyClass();
try {
$object->fetchRow(); // would throw exception
$object->fetchRow(array('id' => 10)); // would work
} catch (Exception $ex) {
// do something, for example:
echo $ex->getMessage(); // echoes 'at least one argument must be supplied'
}
結局、私は非常に単純なメソッドを使用しました。その結果、コードの重複は発生せず、実際には、メソッドを変更せずに、必要に応じて、将来さらに多くの引数を渡すことができます。
public function getMovie($argType, $arg) {
$movieQuery = "SELECT
id, rt_id, imdb_id, url, rt_url, type, adult,
DATE_FORMAT(release_date, '%Y') AS year, date_added,
title, runtime, budget, revenue, homepage, rating,
tagline, overview, popularity, image, backdrop, trailer
FROM movies
WHERE " . $argType . " = ?";
$movieResult = $this->_query($movieQuery, $arg);
$movies = array();
if ($movieResult->fetch_array(MYSQLI_ASSOC)) {
while ($m = $movieResult->fetch_array(MYSQLI_ASSOC)) {
$movies[] = array(
'title' => $m['title'],
'duplicate' => $m['duplicate'],
'url' => $m['url'],
'rt_url' => $m['rt_url'],
'release_date' => $m['release_date'],
'date_added' => $m['date_added'],
'type' => 'movie',
'adult' => $m['adult'],
'id' => $id,
'rt_id' => $m['rt_id'],
'imdb_id' => $m['imdb_id'],
'rating' => $m['rating'],
'tagline' => $m['tagline'],
'overview' => $m['overview'],
'popularity' => $m['popularity'],
'runtime' => $m['runtime'],
'budget' => $m['budget'],
'revenue' => $m['revenue'],
'homepage' => $m['homepage'],
'image' => $m['image'],
'backdrop' => $m['backdrop'],
'trailer' => $m['trailer']
);
}
return $movies;
} else {
return false;
}
}
どちらか一方しか使用できない場合は、状態があります。状態がある場合は、ポリモーフィズムが必要です。この非常に小さなユースケースでは、2つの異なる方法が必要です。
public function getById($id) {}
public function getByUrl($url) {}
これで終わりです。それはあなたがあなた自身のためにできる最善のことです。
(ユーザー入力の場合のように)渡されるものが事前にわからない場合にのみ、 3番目のメソッドを作成して、入力文字列を解析および検証し、それがどのタイプであるかを判別して、適切な方法。