1

呼び出しているメソッド/関数(クラス内)があり、idまたはurlのいずれかを渡したい。次に、メソッドはmysqlWHEREクエリでこれらの引数の1つを使用します。どちらか一方しか使用できません。

2つの引数のいずれかを要求するにはどうすればよいですか?つまり、2つの引数のうち1つだけをオプションにするにはどうすればよいですか?

両方の引数をオプションにして、いくつかのif elseステートメントを使用するよりも良い方法はありますか?

4

3 に答える 3

1

文字通り引数が必要な場合:

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'
}
于 2012-11-18T23:19:51.270 に答える
1

結局、私は非常に単純なメソッドを使用しました。その結果、コードの重複は発生せず、実際には、メソッドを変更せずに、必要に応じて、将来さらに多くの引数を渡すことができます。

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;
    }
}
于 2012-11-19T01:17:32.487 に答える
0

どちらか一方しか使用できない場合は、状態があります。状態がある場合は、ポリモーフィズムが必要です。この非常に小さなユースケースでは、2つの異なる方法が必要です。

public function getById($id) {}
public function getByUrl($url) {}

これで終わりです。それはあなたがあなた自身のためにできる最善のことです。

(ユーザー入力の場合のように)渡されるものが事前にわからない場合にのみ、 3番目のメソッドを作成して、入力文字列を解析および検証し、それがどのタイプであるかを判別して、適切な方法。

于 2012-11-18T23:24:21.697 に答える