先看代:
<?php
クラス StrictCoownedClass {
プライベート $arr = array('x' => NULL, 'y' => NULL);
関数 __construct() {
print "StrictCoownedClass を作成しています";
「<br/>」を印刷します。
}
関数 __destruct() {
「<br/>」を印刷します。
print "StrictCoownedClass が破棄されています";
}
関数 __get($property) {
if (array_key_exists($property, $this->arr)) {
$this->arr[$property] を返します;
} それ以外 {
print "エラー: x と y 以外のプロパティを読み取れませんn";
}
}
関数 __set($property, $value) {
if (array_key_exists($property, $this->arr)) {
$this->arr[$property] = $value;
} それ以外 {
print "エラー: x と y 以外のプロパティを書き込むことはできませんn";
}
}
}
$obj = 新しい StrictCoownedClass();
$obj->x = 1;
$obj->x を出力します。
「<br/>」を印刷します。
$obj->n = 2;
「<br/>」を印刷します。
$obj->n を出力します。
?>
输出結果:
StrictCoownedClass が作成されています
1
エラー: x と y 以外のプロパティは書き込めません
エラー: x と y 以外のプロパティを読み取れません
StrictCoownedClass が破棄されています
__construct() と __destruct() は、Java の構造関数および C の解析関数に相当します。
以下__get和__set请見る以下:
参考自: http://www.phpchina.com/html/54/26354-31906.html
.__set() __get() __isset() __unset() の 4 つのメソッドの用途は、一般に、このクラスのプロパティをプライベートに設定し、これをさらに実現するものです。非常に頻繁に使用されるため、PHP5 では、そのプロパティを取得および評価するための 2 つの関数「__get()」と「__set()」、およびプロパティを検査する「__isset()」とプロパティを削除するメソッド「__unset()」が定義されています。 )」。
上で、私たちは各プロパティの設定と取得のためのメソッドを提供し、PHP5 ではプロパティの設定と取得のためのメソッド「__set()」と「__get()」を提供しました。方法、この 2 つの方法は存在するものではなく、私が手動で追加したものです。画像構築方法 (__construct()) と同じように、次の方法でこの 2 つを追加できます。方法、もちろん、個人の风格を追加することもできます:
//__get() メソッド用来取得私有プロパティ
プライベート関数__get($property_name) {
if(isset($this->$property_name)) {
return($this->$property_name);
}それ以外 {
戻り値(NULL);
}
}
//__set() メソッドを使用して私のプロパティを設定します
private function__set($property_name,$value) {
$this->$property_name=$value;
}
__get() メソッド: このメソッドは、私が所有する構成プロパティ値を取得するために使用します、パラメータがあり、パラメータは取得する必要のある構成プロパティの名前を入力し、取得したプロパティ値を返します。このメソッドは私による手動の削除用です。このメソッドはプライベートなプロパティにすることができ、プライベートなプロパティを直接取得する場合に、オブジェクトが自動的に使用できるようになります。ただし、「echo $p1->name」という句を使用してこのメソッドを追加した場合は、__get($property_name) メソッドが自動的に取得されます。プロパティ名がパラメータ $property_name に渡され、このメソッドの内部実行によって、渡された私有プロパティの値が返されます。プロパティが私有として密閉されていない場合、オブジェクト自体はこのメソッドを使用して自動的に削除されません。
__set() メソッド: このメソッドは私有のプロパティ設定値のために使用され、2 つのパラメータがあります。最初のパラメータは設定値に必要なプロパティ名であり、2 番目のパラメータは必要なプロパティ設定値であり、戻りはありません。このメソッドも同様に手動で使用する必要はなく、私有のものとして扱うこともできます。私有のプロパティ値を直接設定する場合は自動的に使用され、__set() がない場合、このメソッドは私有のプロパティがすでにパッケージ化されています。 ,これは許可されていません,例:$this->name='zhangsan',このような問題が発生しましたが、結果的には__set($property_name, $value)この方法を类里面に追加しました、私が直接所有しているプロパティの時期に、自動化するには、name のようなプロパティを $property_name に渡し、評価対象の値 "zhangsan" を $value に渡し、この方法を実行することで、評価の目的を達成します。この方法をそのまま使用することはできません。非合法な値が入らないようにするには、次のように判断することもできます。
<?php
クラス人 {
//下は人の成员属性、都は封じられた私有成员
プライベート $name; //人の名前
プライベート$セックス; //人の性質
プライベート $age; //人の年月
//__get() メソッド用来取得私有プロパティ
プライベート関数__get($property_name) {
echo"私がプロパティ値を直接取得したとき、自動でこの__get() メソッドを使用しました<br>";
if(isset($this->$property_name)) {
return($this->$property_name);
} それ以外 {
戻り値(NULL);
}
}
//__set() メソッドを使用して私のプロパティを設定します
private function__set($property_name,$value) {
echo"私有プロパティ値を直接設定する際に、この__set() メソッドを私有プロパティ値として自動的に使用しました<br>";
$this->$property_name=$value;
}
}
$p1=新しい人();
// 私が所有するプロパティを直接操作し、会議自動使用__set() メソッドを実行します。
$p1->name="张三";
$p1->sex="男";
$p1->年齢=20;
// 私が所有するプロパティの値を直接取得し、会議自動调用__get() メソッドを返し、プロパティの値を返します
echo"姓名:".$p1->name."<br>";
echo"性别:".$p1->sex."<br>";
echo"年龄:".$p1->年齢。"<br>";
?>
程序実行結果:
私有プロパティ値を直接設定するときは、この__set() メソッドを私有プロパティ値として自動的に使用します。私有プロパティ値を直接設定するときは、この__set() メソッドを私有プロパティ値として使用します。のとき、自動调はこの__set() メソッドを私有プロパティ値に直接取得するとき、自動调はこの__get() メソッドを使用します姓名:张三この__get() メソッドの性質: 男在在属性値を直接取得したとき, 自動调用了 この__get() メソッド年龄: 20
上記のコードは、上 __get() および __set() メソッドを追加しない場合、プログラムが問題を引き起こす可能性があります。これは、私がこの種の外部操作を行うことができないためです。一方、上のコードは、__get() および __set() メソッドを使用して自動的に実行されます。助けに来てください、私は包装されたものを直接保存しています。
__isset() メソッド:このメソッドの前に次の「isset()」関数の使用法を参照します。isset() は、変数が存在するかどうかを決定する関数であり、変数が存在する場合はパラメータとして 1 つの変数を入力します。 true を返すか、false を返すか。この関数は、オブジェクトの外部で「isset()」を使用する場合、オブジェクトの内部の設定がそのオブジェクトを使用できるように設定されているかどうかを検査します。 、私はこの関数を使用してオブジェクトのプロパティを決定できますが、私が持っているオブジェクトのプロパティの場合、この関数は機能しません。私がカプセル化されているため、外部では見ることができません。 "isset()" 関数を使用して、私有成プロパティが設定されているかどうかを確認します。オブジェクトのエリアの私有が設定されているかどうかを確認するには、このような操作を自動的に実行します。类里面追加上下面このような代コードは可能です:
プライベート関数__isset($nm) {
echo"当在类外部使用 isset() 関数数测定私有成员$nm 時,自動调用<br>";
return isset($this->$nm);
}
__unset() メソッド:このメソッドの前を見ます、私も先を見ます次の「unset()」この関数、「unset()」この関数の作用は指定された量であり、パラメータは除かれる量です。ただし、1 つのオブジェクトの外部でオブジェクトの内部の構成プロパティを削除する「unset()」関数を使用できない場合や、オブジェクトの内部の構成プロパティが公開されている場合は、この関数をオブジェクトの外部で使用できます。オブジェクトの公開プロパティを削除します。オブジェクトの成り立ちプロパティが私にある場合、私はこの関数を制限なく削除しますが、同じように結果は 1 つのオブジェクトの表面で「__unset()」を実行すると、オブジェクトの外部から削除できます。オブジェクトの内部でこのメソッドを「__unset()」に追加した後、オブジェクト外部で「unset()」関数を使用してオブジェクト内部の私有プロパティを削除すると、「__unset()」関数が自動的に使用されます。私たちは、オブジェクトの内部の私有属性を削除しましたが、この方法は、オブジェクトの内部で上下に追加されるコードでも実現できます。
プライベート関数__unset($nm) {
echo"当常外部で unset() 関数を使用して私有成時に自動調整する<br>";
unset($this->$nm);
}
完璧な例を一つ見てみましょう:
<?php
クラス人 {
//下は人間の成员プロパティです
プライベート $name; //人の名前
プライベート$セックス; //人の性質
プライベート $age; //人の年月
//__get() メソッド用来取得私有プロパティ
プライベート関数__get($property_name) {
if(isset($this->$property_name)) {
return($this->$property_name);
}それ以外{
戻り値(NULL);
}
}
//__set() メソッドを使用して私のプロパティを設定します
private function__set($property_name,$value) {
$this->$property_name=$value;
}
//__isset() メソッド
プライベート関数__isset($nm) {
echo"isset()関数数测定私有成员時,自动调用<br>";
return isset($this->$nm);
}
//__unset() メソッド
プライベート関数__unset($nm) {
echo"当常外部で unset() 関数を使用して私有成時に自動調整する<br>";
unset($this->$nm);
}
}
$p1=新しい人();
$p1->name="これは人の名前です";
//isset() 関数を使用して私有成员を使用するとき、自動的に__isset() メソッドが完了し、結果が true として返されます。
echovar_dump(isset($p1->name))."<br>";
echo $p1->name."<br>";
//使用中unset()関数数删除私有成员時,自動调用__unset()方法帮我们完了,删除name私有有成员
unset($p1->name);
//既被删除了,所行不会出出
echo $p1->name;
?>
出力結果は次のとおりです:
isset()関数数测定私有成员時,自動调用
ブール(真)
これは人の名前です
クラス外部で unset() 関数を使用して、私が存在する場合に自動的に調整されます。
__set()、__get()、__isset()、__unset() この 4 つのメソッドはいずれも私たちがオブジェクトの領域に追加したもので、必要に応じて自動的に調整され、オブジェクトの外部とオブジェクトの内部で私的なプロパティの操作を実行します。