3

私は他の誰かのクラスを使用していますが、その人は 5 つの引数を持つ関数を定義しています。

Sentry.php で:

function checkLogin($user = '',$pass = '',$group = 10,$goodRedirect = '',$badRedirect = '')

5 つのフィールドすべてに入力すると、ログイン手順が開始されます。

現在、彼がこれを使用する方法を説明しているページに、php.net によると意味をなさないスニペットがあります。

歩哨をロードするページで:

require_once('../system/Sentry.php');
$theSentry = new Sentry();
if(!$theSentry->checkLogin(2)){ header("Location: login.php"); die(); }

デフォルトでは、 $group 引数が <= 10 (デフォルト) であるかどうかをチェックするように動作する必要があります。この状況では、2 つにする必要があります。チェックしたユーザーのグループ変数が 2 以下の場合、そのユーザーはページを表示できます。

ただし、これは機能せず、非常に明白な理由があります。PHPマニュアルには次のように記載されています。

デフォルトの引数を使用する場合、デフォルトはデフォルト以外の引数の右側に配置する必要があることに注意してください。そうしないと、期待どおりに動作しません。

そのため、phpbuilder.com によると、コードには$variable = default_something、関数の呼び出しを入力するためのオプションの ( ) フィールドがあってはならず、5 つの引数の 3 番目として定義されるべきではありません。

このような関数を使用するにはどうすればよいですか?:

checkLogin(2)
4

5 に答える 5

9

デフォルト引数は、オーバーロードされた関数の欠如を処理する PHP の方法です。Java では、次のように記述できます。

public void login(String username)
public void login(String username, String password)

PHP では、次のように解決する必要があります。

function login($username, $password = '')

このように $username は必須で、$password はオプションです。これは便利かもしれませんが、常にそうとは限りません。あなたの例には引数のログがあり、それらはすべてオプションです。これに対するクリーンな解決策は、作業を行う 1 つの関数を作成し、「便利な」メソッドを追加してインターフェイスをクリーンにすることです。

したがって、次を追加します。

function checkLoginGroup($group = 10) {
  $this->checkLogin('', '', $group);
}

既存の関数を呼び出すだけですが、次のように呼び出すだけで、よりクリーンなインターフェイスが可能になります。

$theSentry->checkLoginGroup(2);

提供されたメソッドをプライベート (または必要に応じて保護) にして、パブリックの「便利な」メソッドを作成すると、実装の詳細を隠すことができます。

ただし、元のクラスを変更できない、または変更したくない場合は、サブクラスを作成できる場合があります。

于 2009-08-06T22:50:04.453 に答える
1

引数の順序を変更することは可能です...しかし、「オプションを増やす」または「オプションを減らす」ために別の引数が必要になるのはなぜですか? その順序をもう一度変更しますか?
そして、それで、関数に対して行われたすべての呼び出し ?

関数の宣言を考慮して、3 番目の引数のみを渡すには、最初の 3 つの引数を指定する方法しかありません。そのために)最初の2つ:

checkLogin('', '', 20);

私の意見では、その代わりにこれを使用します:

checkLogin(null, null, 20);

明示的であるという利点があります。関数の宣言を見ている人は、最初の 2 つのパラメーターにデフォルト値を使用していることにすぐに気付くでしょう。

を使用するNULLと、コードを読んでいる人は、関数のコード内をチェックしてNULL、 が特別な方法で処理されているかどうかを確認する必要があります (結局、そうなる可能性があります!)。これがデフォルト値を渡す方法であることを誰かが理解するのは簡単ではありません...デフォルト値ではないので^^


他の解決策は、関数のリファクタリングを意味します。

いずれにせよ、関数が待機しているパラメーターを IDE が表示する機能が失われます。そしてそれは悪いです:-(
そして、phpdocも失うでしょう...

于 2009-08-06T22:51:35.667 に答える
1

Mythicas の優れた回答に加えて、多くのオプションの引数を処理する別の方法を指摘したいと思います: 配列です。

function checkLogin($args) {
    $defaults = array('user' => null, 'pass' => null, 'group' => null, ...);
    $args = array_merge($defaults, $args);
    ...
}

checkLogin(array('user' => 'x', 'group' => 9));

これは基本的に、PHP のオプション/必須の引数構文を完全にバイパスし、代わりにこれらを内部でカスタム処理します。説明した問題を回避し、関数呼び出しを非常に読みやすくするという利点があります。問題は、関数がより複雑になり、引数の存在をチェックする PHP を利用できないことです。

于 2009-08-06T23:46:49.597 に答える
0

最も簡単な方法は、$group が最初になるように引数の順序を変更することです。

于 2009-08-06T22:35:40.550 に答える
-1
checkLogin(NULL,NULL,2);

しかし、正直なところコーディング スタイルが悪いです。

于 2009-08-06T22:32:04.223 に答える