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

PHP オブジェクト指向ガイド (11) __toString() の使用法、オブジェクトのクローン作成、呼び出しエラーの __call 処理_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:44:04944ブラウズ

16.__toString()メソッド
クラス(PHPから提供される)内で「-」で始まるメソッド名を宣言するメソッドは、ある時点で異なる状況下で自動的に呼び出されて実行されるメソッドであることは前に述べました。 "__toString()" メソッドは、
がオブジェクト参照を直接出力するときにも自動的に呼び出されます。たとえば、"$p=new
person()" のように、オブジェクト参照はポインターであると述べました。 echo を使用して $p を直接出力することはできません。これは、クラス ) メソッドで
"__toString(") を定義すると、「キャッチ可能な致命的なエラー: クラス Person のオブジェクトを文字列に変換できませんでした」のようなエラーを出力します。 、オブジェクト参照を直接出力する場合、エラーは発生しませんが、「__toString()」メソッドで返された文字を出力するために自動的に「__toString()」メソッドが呼び出されてしまうため、「__toString()」メソッドが必要となります。戻り値 (return ステートメント) になります。
コードスニペット



コードをコピー

コードは次のとおりです: // 単純なクラスを宣言します
class TestClass{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
//__toString メソッドを定義し、メンバー属性を返す $foo
public function __toString() {
return $this->foo
}
$class = new TestClass('Hello');
//オブジェクトを直接出力します
?>


上記の出力例: こんにちは
17. 2 つまたは複数の同一のオブジェクトを使用する必要がある場合があります。 「new」
キーワードを使用してオブジェクトを再作成し、同じ属性を割り当てる場合、これはより面倒でエラーが発生しやすいため、1 つのオブジェクトに基づいて同一のオブジェクトを完全にクローンする必要があります。クローン作成後、2 つのオブジェクトは相互に干渉しません。
PHP5 では、「clone」キーワードを使用してオブジェクトを複製します。
コードスニペット

コードをコピーします

コードは次のとおりです:


class Person{
//以下はメンバー属性です。その人の名前
var $name; // その人の性別
var $age; // 属性 name $name、性別 $sex を定義します。 age $age 割り当てを実行します function __construct($name="", $sex="", $age=""){ $this->name=$name; $this->sex=$sex; $this ->age=$age; }
//この人の話し方、自分の属性を伝える
function Say() {
echo "私の名前は: ".$this->name."性別: ".$this->sex." 私の年齢: ".$this->age."
";
}
}
$p1=new person("张三", " 男性", 20);
//「clone」を使用して、p1 オブジェクトと同じプロパティとメソッドを持つ新しいオブジェクト p2 を複製します。
$p2=clone $p1;
$p2->say();


PHP5 では、オブジェクトのクローン作成時に自動的に呼び出される特別なメソッド名「__clone()」が定義されています。 「__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; } //この人の話し方を教えてください属性function Say() { echo "I 私の名前は: ".$this->name." 性別: ".$this->性別" 私の年齢: ".$this->age. "
";
}
//オブジェクトが複製されたときに自動的に呼び出されるメソッド。複製後に元のオブジェクトの内容を変更したい場合は、__clone() で元の
属性とメソッドを書き直す必要があります。 function __clone(){
//$this はコピー p2 を参照し、$that は元の p1 を参照するため、このメソッドではコピーの属性が変更されます。
$this->name="私は偽の$that->name";
$this->age=30
}
}
$p1=new person("张三", "男" 、 20);
$p2=クローン $p1;
$p2->say();
上記の例の出力:
実行結果
私の名前: Zhang San 性別: 男性 私の年齢: 20
私の名前: 私は偽 Zhang San 性別: 男性 私の年齢: 30
18 .__call は呼び出しエラーを処理します
プログラム開発において、オブジェクトを使用してオブジェクトの内部メソッドを呼び出すときに、呼び出されたメソッドが存在しない場合、プログラムはエラーとなり、プログラムは終了して実行を続行できません。したがって、プログラムがオブジェクト内に存在しないメソッドを呼び出す場合、呼び出されたメソッドと使用されたパラメータが存在しないことを示すプロンプトが表示されますが、現時点ではプログラムの実行を続行することができます。この場合、自動呼び出しを使用する必要があります。メソッド「__call()」が存在しません。
コードスニペット



コードをコピー
コードは次のとおりです: //これはテストクラスであり、属性やメソッドはありません
class Test{
}
//テストクラスオブジェクトを生成する
$test=new Test();
//オブジェクトに存在しないメソッドを呼び出す
$test->demo("one", "two", "three"); /プログラムはここでは実行されません
echo "this is a test
?>


上記の例では次のエラーが発生し、プログラムは実行を続行できません
致命的なエラー: 未定義への呼び出しメソッド Test::demo()
以下に「__call()」メソッドを追加しましょう。このメソッドには 2 つのパラメータがあります。最初のパラメータは、__call() メソッドが存在しないときに呼び出します。自動的に呼び出される場合、3 番目のパラメータには存在しないメソッドのメソッド名が渡され、2 番目のパラメータにはこのメソッドの複数のパラメータが配列の形式で渡されます。
コードスニペット



コードをコピー

コードは次のとおりです:
//これはテストクラスであり、それには属性やメソッドはありませんclass Test{ //自動的に実行される存在しないメソッドの呼び出し 呼び出されたメソッド、最初のパラメータはメソッド名、2 番目のパラメータは配列パラメータです
function __call($function_name, $args){
print "呼び出した関数: $function_name(parameters: " ;
print_r($ args);
print ") は存在しません!
n";
}
}
//Test クラスのオブジェクトを生成します
$test=new Test();オブジェクトに存在しないメソッドです
$test->demo("one", "two", "three");
//プログラムは終了せず、ここで実行できます
echo "これはテストです< br>";
?>


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


http://www.bkjia.com/PHPjc/320630.html

www.bkjia.com
tru​​e

http://www.bkjia.com/PHPjc/320630.html技術記事 16.__toString()メソッド 前にも書きましたが、クラス内で「-」で始まるメソッド名を宣言したメソッド(PHPから提供されています)は、あるタイミングで別の状況下で自動的に呼び出されて実行されます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。