1

私はZendPHP5認定の勉強をしていますが、すべてが良さそうに見えますが、参照する変数を渡したり返したりするための実際の例を見つけることができません。

誰かがこれをいつ使うべきかの例を持っているなら、それはとてもいいでしょう?

4

4 に答える 4

2

配列から特定の値を削除する関数を作成するとします。

function remove_elements($array, $item1, $item2, ...) {
  ...
}

配列をコピーして返すことができます。しかし、何かが削除されたかどうかを知りたい場合はどうなりますか?代わりに、配列をインプレースで変更し、削除された要素の数を返します。それで:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

関数内に複雑な構造を作成する場合は、そのコピーではなく、その構造への参照を返したい場合があります。しかし、PHPはコピーオンライトを使用するため(つまり、変更されるまでコピーされない)、これはかなり限界的なケースですが、いくつかの有効なユースケースがあります。

クラスのメンバー関数を作成する場合は、参照で返す方が理にかなっています。データメンバーへの参照を返すこともできますが、これによってカプセル化が破られる可能性もあります。

最後に、すべてのオブジェクトがデフォルトで参照によって渡され、返されることに注意してください。他のすべては、値によって渡され、返されます。

于 2009-10-19T09:20:15.273 に答える
1

参照渡し: asort()のような関数

$array = array(3, 2, 1);
asort($array);
于 2009-10-19T09:21:01.373 に答える
0

php5 のオブジェクトは、デフォルトで参照によって渡されます。(正しい説明については、http://docs.php.net/language.oop5.referencesを参照してください)

参照による引数の受け渡しはすでに回答されています...

参照による戻り値の (実際の) 例として、メソッドが独自の呼び出しコンテキスト ($this) と同じオブジェクトへの参照を返す流暢なインターフェイスを選択します。戻り値がコピー/クローンの場合、これは (予想どおり) 機能しません。

例えば

class MyClass {  
  protected $foo = 'n/a';
  protected $bar = 'n/a';

  function foo($val) {
    $this->foo = (int)$val;
    return $this;
  }

  function bar($val) {
    $this->bar = (int)$val;
    return $this;
  }

  function __toString() {
    return 'foo='.$this->foo.' bar='.$this->bar;
  }
}

$o = new MyClass;
$o->foo(1)
  ->bar(2);
echo $o;

これは印刷foo=1 bar=2され、それが期待される結果であると思います。ここで驚くことはありません。メソッドが $this を値で返した場合、それは機能しなくなります。php にコピーを返すように強制することで、それをテストできます。行の代わりにreturn $this使用

return clone $this;

出力は次のようになります

foo=1 bar=n/a

(そして、私はそのインターフェースを直感的とは呼びません;-))

于 2009-10-19T09:58:22.517 に答える
-1

次のように、chainig を使用する場合に役立ちます。

    public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}

....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();

……スライ。Volkers と同じ :( (Fluent Interface は私が知っているように連鎖しています)。

load-method を備えた流暢なインターフェイスがあるイメージ。Load インターフェイスは、一部のデータを置換または追加します。ここでは、参照値 $success による呼び出しを使用して、読み込みが成功したかどうかを判断すると便利です。

参照渡し: 行のリストを持ついくつかのデータベース オブジェクトを取得します。Nr。of 行は、すべてのオブジェクトの右側のデータを指します (parallelsl)。番号を返す場合。それを次のオブジェクトに渡すと、あるオブジェクトの行をスキップして、他のオブジェクトもスキップできます。常に有効なオブジェクトの束を持っています。

于 2012-12-02T02:28:15.563 に答える