私はこのコードを理解しようとしているのですが、最後の行にたどり着いたとき、理解できませんでした。 :(
調べるためにあなたの助けを借りることができます。return $this
はどういう意味ですか?
public function setOptions(array $options) {
$methods = get_class_methods($this);
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
//???? - return what ?
return $this;
}
更新:
わかりやすくするためにコメントを削除しました。
このコーディング方法は fluent interface と呼ばれます。 return $this
は現在のオブジェクトを返すため、次のようなコードを記述できます。
$object
->function1()
->function2()
->function3()
;
の代わりに:
$object->function1();
$object->function2();
$object->function3();
これにより、このメソッドが呼び出されたインスタンスが返されます。これは通常 流暢なインターフェース を達成するために行われるので、次のようなものを呼び出すことができます:
CoolClass::factory('hello')->setOptions(array('coolness' => 5))->sayHello();
setOptions
とsayHello
の両方が同じオブジェクトで呼び出される場合。
$this
は、メソッドが現在実行されている現在のオブジェクトを意味します。 $this
を返すことにより、メソッドが機能しているオブジェクトへの参照が呼び出し元の関数に返されます。
だから誰もが
$foo2 = $foo->SetOptions($bar);
$ foo2は$ fooも参照するようになりました。
$ thisは、その関数を含むクラスです。
したがって、次のように呼び出すと、
$obj->setOptions($options)
新しいオプションで設定された$ objを返します。一般に、このように設定されている場合、オブジェクト自体に影響を与えるため、戻り値をキャプチャする必要はありませんが、インラインで使用できるようにします。
あなただけの関数チェーンを作成することができます
class My_class
{
public function method1($param)
{
/*
* logic here
*/
return $this;
}
public function method2($param)
{
/*
* logic here
*/
return $this;
}
public function method3($param)
{
/*
* logic here
*/
return $this;
}
}
これを使うことができます
My_class obj = new My_class();
$return = obj->method1($param)->method2($param)->method3($param);
SetOptionsメソッドがProgramOptionsクラスなどの一部である場合、$ thisはメソッドを含むクラスを参照するため、ProgramOptionsのインスタンスを返します。
その一般的なOOP Fluent Interface)と呼ばれる手法 です。これは、PHPのようなメソッドのカスケードをサポートしていない言語での複数のメソッド呼び出しのチェーンを支援することを主な目的としています。
$ thisを返す;
そのクラスの更新されたインスタンス(オブジェクト)を返すため、そのスコープで別の呼び出しを行うことができます。 PHPの例を参照してください。
class Class_Name {
private field1;
private field2;
private field3;
public function setField1($value){
$this->field1 = $value;
return $this;
}
public function setField2($value){
$this->field2 = $value;
return $this;
}
public function setField3($value){
$this->field3 = $value;
return $this;
}
}
$object = new Class_Name();
$object->setField1($value1)->setField2($value2)->setField3($value3);