ホームページ >php教程 >php手册 >PHP オブジェクト指向ガイド (11) __toString() の使用法、オブジェクトのクローン作成、呼び出しエラーの __call 処理

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

WBOY
WBOYオリジナル
2016-06-13 12:21:471069ブラウズ

16.__toString() メソッド
クラス (PHP から提供された) 内で「-」で始まるメソッド名の宣言方法が、ある時点で異なると前述しました
この場合、実行メソッドは自動的に呼び出されます。先ほど、オブジェクト参照がポインタであると述べましたが、これは
がオブジェクト参照を直接出力するときにも自動的に呼び出されます。 : "$ p=new
person()"、$p は参照です。$p を直接出力するために echo を使用することはできません。これにより、「キャッチ可能な致命的な
エラー: クラス パーソンのオブジェクトを変換できませんでした」が出力されます。このエラーのように、クラス内に
「__toString()」メソッドを定義しておけば、オブジェクト参照を直接出力する際に​​エラーは発生せず、代わりに
「__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' ) ;
// オブジェクトを直接出力します
echo $class;


上記の出力例: こんにちは

17.プロジェクト内で 2 つ以上の同一のオブジェクトを使用する必要があります。「new」
キーワードを使用してオブジェクトを再作成する場合、これはより面倒でエラーが発生しやすいため、< を行う必要があります。 🎜>オブジェクトから同一のオブジェクトを完全にクローンすることが非常に必要であり、クローン作成後、2 つのオブジェクト
は互いに干渉しません。
PHP5 では、「clone」キーワードを使用してオブジェクトのクローンを作成します。
コード スニペット



コードをコピー

コードは次のとおりです。 <class person{

//以下は人物のメンバー属性です

var $name //人物の名前
var $sex;人の性別
var $age; // 人の年齢
// 属性名 $name、性別 $sex 、年齢 $age
に値を割り当てるコンストラクター パラメーターを定義します。 __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( "Zhang San", " Male", 20);
//「clone」を使用して、p1 オブジェクトと同じプロパティとメソッドを持つ新しいオブジェクト p2 を複製します。
$p2=clone $p1;
$p2->say();


PHP5 は特別なメソッド名「__clone()」を定義しますオブジェクトのクローン作成時に自動的に呼び出されるメソッド。
の内容を変更する場合は、「__clone()」メソッドを使用します。クローン作成後の元のオブジェクト。元の属性とメソッドは __clone() で書き換える必要があります。「__clone()」メソッドにはパラメータを含めることはできません。
これには、$this と $this が指す 2 つのポインターが自動的に含まれます。
コード スニペット



コピー コード

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

class person{ //以下は、var $name; //人の名前var $sex; //人の性別var $age; //その人の年齢

//コンストラクターパラメータを定義する 属性名 $name、性別 $sex 、年齢 $age

function __construct($name="", $sex="", $age=""){
$this->name= $name;
$this->gt;age=$age;
//この人の話し方、自分の属性を伝える
function Say() {
echo "私の名前は: ".$this->name." 性別: ".$this- >sex." 私の年齢は: ".$this ->age."
";
}
//コンテンツを変更したい場合に自動的に呼び出されるメソッド。クローン作成後に元のオブジェクトを複製するには、__clone() で元のオブジェクトを書き直す必要があります。

関数 __clone() の属性とメソッド {
//$this はコピー p2 を参照し、$that はコピー p2 を参照します。したがって、このメソッドでは、コピーの属性が変更されます。
$this->name="私は偽の $that->name";
$this->age=30;
}
}
$p1=新しい人("张三", "男", 20);
$p2=clone $p1;
$p2->say(); ?>


上記の例の出力:
実行結果
私の名前は: Zhang San 性別: 男性 私の年齢: 20
私の名前は: 私は偽 Zhang San です 性別: 男性 私の年齢は: 30
18.__call 呼び出しエラーの処理
プログラム開発において、オブジェクトを使用してオブジェクトの内部メソッドを呼び出すときに、呼び出されたメソッドが存在しない場合、プログラム
はエラーを発生し、その後プログラムが終了し、実行を続行できなくなります。したがって、プログラムがオブジェクト内に存在しないメソッド
を呼び出すと、呼び出されたメソッドと使用されたパラメーターが存在しないことを通知するプロンプトが表示されますが、この時点ではプログラムは実行を続行できます。 🎜> 呼び出し内に存在しないメソッドを使用します。メソッドが使用されると、メソッド「__call()」が自動的に呼び出されます。
コード スニペット

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

//Thisはテスト クラスです。その中には属性やメソッドはありません。
class Test{
}
//テスト クラスのオブジェクトを生成します。
$test=new Test();呼び出し元のオブジェクトには存在しません。 Method
$test->demo("one", "two", "three")
//ここではプログラムは実行されません
echo "これはtest
";
?>


上記の例では次のエラーが発生し、プログラムは実行を続行できません。

致命的なエラー: 未定義のメソッド テストの呼び出し: :demo()
以下に「__call()」メソッドを追加しましょう。このメソッドには 2 つのパラメータがあります。最初のパラメータは、__call( を自動的に呼び出すプロセス中に、存在しないメソッド
を呼び出します。 ) メソッドには、存在しないメソッドのメソッド名を渡します。最初のパラメーターには、2 番目のパラメーター
に、このメソッドの複数のパラメーターを配列の形式で渡します。
コード スニペット


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

//Thisはテストクラスであり、その中には属性やメソッドはありません。
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>";
?>


上記の例の出力結果は次のとおりです:

実行結果
呼び出した関数: demo(Parameter: Array ( [0 ] => 1 [1] => 2 [2 ] => 3 ) は存在しません。
これはテストです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。