ホームページ > バックエンド開発 > PHPチュートリアル > PHP オブジェクト指向ガイド __toString() の使用法、オブジェクトの複製、__call、呼び出しエラーの処理

PHP オブジェクト指向ガイド __toString() の使用法、オブジェクトの複製、__call、呼び出しエラーの処理

高洛峰
リリース: 2023-03-04 15:44:02
オリジナル
1411 人が閲覧しました

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(&#39;Hello&#39;); 
//直接输出对象 
echo $class; 
?>
ログイン後にコピー

上記の例の出力: こんにちは
17. オブジェクトの複製

"new"

キーワードを使用してオブジェクトを再作成し、割り当てを行う必要がある場合があります。これは面倒でエラーが発生しやすいため、オブジェクトから同一のオブジェクトを完全に複製することが非常に必要であり、複製後は 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(); 
?>
ログイン後にコピー

PHP5 では、オブジェクトのクローン作成時に自動的に呼び出される特別なメソッド名「__clone()」が定義されています。メソッドは、元のオブジェクトと同じ属性とメソッドを持つオブジェクトを作成します。クローン作成後に元のオブジェクトの内容を変更したい場合は、__clone()、「__clone()」で元の属性とメソッドを書き直す必要があります。メソッドにはパラメーターを含めることはできません。
2 つのポインター ($this と $that) が自動的に含まれます。$this はコピーを指し、$that はオリジナルを指します。
コード スニペット
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>"; 
?>
ログイン後にコピー

上記の例では次のエラーが発生し、プログラムは実行を続行できません。
致命的なエラー: 未定義メソッド Test::demo() の呼び出し
ここで、「__call()」メソッドを追加します。メソッドのパラメータは 2 つあり、最初のパラメータは存在しないメソッドです。処理中に __call() メソッドが自動的に呼び出されるとき、存在しないメソッドのメソッド名が最初のパラメータに渡されます。このメソッドの複数のパラメータは配列の形式で渡されます。
コード スニペット
<?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>"; 
?>
ログイン後にコピー

上記の例の出力結果は次のとおりです:
実行結果
呼び出した関数:デモ (パラメーター: Array ( [0] => one [1] => two [2] => 3 ) ) は存在しません!
これはテストです。

PHP オブジェクト指向ガイド __toString() の使用法、オブジェクトのクローン作成、呼び出しエラーの __call 処理、および関連記事の詳細については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート