14

次のようなメソッドシグネチャがあるとしましょう

public static function explodeDn($dn, array &$keys = null, array &$vals = null,
    $caseFold = self::ATTR_CASEFOLD_NONE)

の後のすべてのパラメーターを省略することで、メソッドを簡単に呼び出すことができます$dn

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com');

3 つのパラメーターを指定してメソッドを呼び出すこともできます。

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v);

そして4つのパラメータで:

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);

しかし、たとえば次のパラメーターの組み合わせでメソッドを呼び出すことができないのはなぜですか。

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, null, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);
$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', null, $v);

nullメソッドに渡すこととデフォルト値に依存することの違いは何ですか? この制約はマニュアルに書かれていますか?回避できますか?

4

6 に答える 6

27

null を参照できないからです。

null を含む変数への参照を持つことができます - それはまさにデフォルト値が行うことです。または、null をリテラル値として渡すこともできますが、out パラメーターが必要なため、ここではできません。

于 2008-11-11T09:07:22.393 に答える
11

NULLを明示的に渡したい場合は、by-ref引数のダミー変数を作成する必要がありますが、その変数を別の行に作成する必要はありません。$ダミー=NULLのような代入式を関数の引数として直接使用できます。

function foo (&$ref = NULL) {

    if (is_null($ref)) $ref="bar";
    echo "$ref\n";        
}

foo($dummy = NULL); //this works!
于 2012-03-15T09:27:35.903 に答える
5

私はこれを自分で見つけたばかりで、かなりショックを受けていますo_O!

これは、PHPのドキュメントに次のように記載されています。

function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee(); // returns "Making a cup of cappuccino."
echo makecoffee(null); // returns "Making a cup of ."
echo makecoffee("espresso"); // returns "Making a cup of espresso."

私はmakecoffee(null)「カプチーノを作る」に戻ると思っていたでしょう。私が使用した回避策の 1 つは、引数が null であるかどうかを関数内でチェックすることです。

function makecoffee($type = null)
{
    if (is_null($type)){ 
       $type = "capuccino";
    }
    return "Making a cup of $type.\n";
}

makecoffee(null)「カプチーノを作る」を返すようになりました。

(これは実際にはZend関連の質問を解決しないことを認識していますが、一部の人にとっては役立つかもしれません...)

于 2010-11-20T15:22:51.563 に答える
4

@トマラク

実際には、デフォルト値は参照を含まない変数を作成します。これは、何かを渡すときに開始できないものです。

理由を説明するために私が見つけたのは、次の例です(私はテストしませんでした):

function foo (&$ref = NULL) {
  $args = func_get_args();
  echo var_export($ref, TRUE).' - '.var_export($args, TRUE);
}
$bar = NULL;
foo();     // NULL - array()
foo($bar); // NULL - array(0 => NULL)

私の意見では、PHP は、
foo($p1, , , $p4);NULL を渡す代わりに with または類似の構文など、特定のパラメーターを渡さない方法を提供する必要があります。
しかしそうではないので、ダミー変数を使用する必要があります。

于 2010-09-03T02:06:17.837 に答える
1

トマラクがここで述べたことを確認するために:

以下の作品:

$k=array();
$v=null;
$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);

良くありませんが、説明は明確でわかりやすいです。

于 2008-11-11T09:15:34.373 に答える