16.__toString()メソッド
クラス(PHPから提供される)内で「-」で始まるメソッド名を宣言するメソッドは、ある時点で異なる状況下で自動的に呼び出されて実行されるメソッドであると以前述べました。 __toString() メソッドも自動的に呼び出されます。これは、
がオブジェクト参照を直接出力するときにも自動的に呼び出されます (例: "$p=new
person()")。 , $ p は参照です。echo を使用して $p を直接出力することはできません。これにより、
"__toString()" を定義すると、「キャッチ可能な致命的なエラー: クラス パーソン のオブジェクトを文字列に変換できませんでした」のようなエラーが出力されます。 class メソッド内でオブジェクト参照を直接出力する場合、エラーは発生しませんが、自動的に「__toString()」メソッドが呼び出され、「__toString()」メソッドで返された文字が出力されるため、「__toString() )"メソッドは必ず
戻り値(return文)が必要です。
コード スニペット
<?php // Declare a simple class class TestClass{ public $foo; public function __construct($foo) { $this->foo = $foo; } //定义一个__toString方法,返加一个成员属性$foo public function __toString() { return $this->foo; } } $class = new TestClass('Hello'); //直接输出对象 echo $class; ?>
キーワードを使用してオブジェクトを再作成し、割り当てを行う必要がある場合があります。これは面倒でエラーが発生しやすいため、オブジェクトから同一のオブジェクトを完全に複製することが非常に必要であり、複製後は 2 つのオブジェクトが相互に干渉しなくなります。
PHP5 では、オブジェクトのクローンを作成するためにキーワード「clone」を使用します。
コード スニペット
<? class Person{ //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name="", $sex="", $age=""){ $this->name=$name; $this->sex=$sex; $this->age=$age; } //这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; } } $p1=new Person("张三", "男", 20); //使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。 $p2=clone $p1; $p2->say(); ?>
class Person{ //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name="", $sex="", $age=""){ $this->name=$name; $this->sex=$sex; $this->age=$age; } //这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; } //对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本 的属性和方法 function __clone(){ //$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。 $this->name="我是假的$that->name"; $this->age=30; } } $p1=new Person("张三", "男", 20); $p2=clone $p1; $p1->say(); $p2->say(); ?>上記の例の出力:
実行結果
私の名前: 張三の性別: 男性 私の年齢: 20
私の名前: 私は偽の張三です 性別: 男性 私の年齢: 30
18.__call は呼び出しエラーを処理します
プログラム開発で、オブジェクトを使用している場合オブジェクトの内部メソッドを呼び出すときに、呼び出されたメソッドが存在しない場合、プログラムはエラーとなり、プログラムは終了して実行を続行できません。したがって、プログラムがオブジェクト内に存在しないメソッドを呼び出す場合、呼び出されたメソッドと使用されたパラメータが存在しないことを示すプロンプトが表示されますが、現時点ではプログラムの実行を続行することができます。この場合、自動呼び出しを使用する必要があります。存在しないメソッドの呼び出し。メソッド「__call()」。
<?php //这是一个测试的类,里面没有属性和方法 class Test{ } //产生一个Test类的对象 $test=new Test(); //调用对象里不存在的方法 $test->demo("one", "two", "three"); //程序不会执行到这里 echo "this is a test<br>"; ?>
<?php //这是一个测试的类,里面没有属性和方法 class Test{ //调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数 function __call($function_name, $args){ print "你所调用的函数:$function_name(参数:"; print_r($args); print ")不存在!<br>\n"; } } //产生一个Test类的对象 $test=new Test(); //调用对象里不存在的方法 $test->demo("one", "two", "three"); //程序不会退出可以执行到这里 echo "this is a test<br>"; ?>
PHP オブジェクト指向ガイド __toString() の使用法、オブジェクトのクローン作成、呼び出しエラーの __call 処理、および関連記事の詳細については、PHP 中国語 Web サイトに注目してください。