PHP オブジェクト指向の _get()、_set() の使用法
一般的に言えば、クラス属性は常にプライベートとして定義します。これはより現実的なロジックに沿ったものです。ただし、属性の読み取りと代入の操作は非常に頻繁に行われるため、PHP5 では属性の取得と代入を行うための 2 つの関数「__get()」と「__set()」があらかじめ定義されています。これは Java での Javabean の操作に似ており、使用されるメソッドも同様ですが、Javabean のように各フィールドで set および get 操作を実行する必要がない点が異なります。 2 つの魔法のメソッドを追加するだけです。つまり、プライベートメンバーの値を設定・取得する操作です。
PHP5 には、属性の値を設定および取得するための特別なメソッド「__set()」と「__get()」が用意されています。これらの 2 つのメソッドはデフォルトでは存在しませんが、内部のクラスに手動で追加します。コンストラクター メソッド (__construct()) と同様に、これら 2 つのメソッドは次の方法で追加することもできます:
//__set() メソッドはプライベート属性を設定するために使用されます
パブリック関数 __set($name,$value){
$this->$name = $value;
}
//__get() メソッドはプライベート属性を取得するために使用されます
パブリック関数 __get($name){
return $this->$name;
}
__get() メソッド: このメソッドはプライベート メンバー属性値を取得するために使用されます。パラメーターは取得するメンバー属性の名前で渡され、取得された属性値は返されません。このメソッドはプライベート メソッドにすることもでき、プライベート プロパティが直接取得されるときにオブジェクトによって自動的に呼び出されます。 private プロパティはカプセル化されているため、値を直接取得することはできませんが、このメソッドをクラスに追加すると、「echo$p1->name」などのステートメントを使用すると、自動的に値が直接取得されます。 __get($name) メソッドを使用し、属性名をパラメーター $name に渡します。このメソッドの内部実行を通じて、渡したプライベート属性の値が返されます。メンバーのプロパティがプライベートとしてカプセル化されていない場合、オブジェクト自体はこのメソッドを自動的に呼び出しません。
__set() メソッド: このメソッドは、プライベート メンバー属性の値を設定するために使用されます。最初のパラメーターは、値を設定する属性の名前です。属性に設定された値はありません。このメソッドは手動で呼び出す必要はなく、プライベート属性値を直接設定するときに自動的に呼び出されます
。
__set() メソッドがない場合は許可されません。たとえば、$this->name='zhangsan' とするとエラーが発生しますが、クラスに __set($property_name, $value) を追加すると、 ) このメソッドは、プライベート属性に直接値を代入する際に自動的に呼び出されます。 $property_name に name などの属性を渡し、$value に代入する値 "zhangsan" を渡します。目的は達成されます。メンバーのプロパティがプライベートとしてカプセル化されていない場合、オブジェクト自体はこのメソッドを自動的に呼び出しません。不正な値を渡さないように、このメソッドで判定することもできます。コードは次のとおりです:
クラス人
{
//以下は人々のメンバー属性であり、すべてカプセル化されたプライベートメンバーです
private $name //その人の名前
private $sex //人の性別
private $age //その人の年齢
//__get() メソッドはプライベート属性を取得するために使用されます
プライベート関数 __get($property_name)
{
echo "プライベート属性値を直接取得する場合、この __get() メソッドが自動的に呼び出されます
";
if(isset($this->$property_name))
{
return($this->$property_name);
}
それ以外
{
return(NULL);
}
}
//__set() メソッドはプライベート属性の設定に使用されます
プライベート関数 __set($property_name, $value)
{
echo "プライベート属性の値を直接設定する場合、値をプライベート属性に割り当てるために __set() メソッドが自動的に呼び出されます
";
$this->$property_name = $value;
}
}
$p1=新しい人();
//プライベート属性に値を直接代入すると、割り当てのために __set() メソッドが自動的に呼び出されます
$p1->name="張三";
$p1->sex="男性";
$p1->年齢=20;
//プライベート属性の値を直接取得すると、__get() メソッドが自動的に呼び出され、メンバー属性の値が返されます
echo "名前:".$p1->名前."
";
echo "性別:".$p1->sex."
";
echo "年齢:".$p1->age."
";
?>
プログラムの実行結果:
プライベート属性の値を直接設定すると、__set() メソッドが自動的に呼び出され、プライベート属性に値が割り当てられます
プライベート属性の値を直接設定すると、__set() メソッドが自動的に呼び出され、プライベート属性に値が割り当てられます
プライベート属性の値を直接設定すると、__set() メソッドが自動的に呼び出され、プライベート属性に値が割り当てられます
private属性値を直接取得する場合は、__get()メソッドが自動的に呼び出されます
名前:張三
private属性値を直接取得する場合は、__get()メソッドが自動的に呼び出されます
性別:男性
private属性値を直接取得する場合は、__get()メソッドが自動的に呼び出されます
年齢: 20歳
上記のコードに __get() メソッドと __set() メソッドが追加されていない場合、プライベート メンバーはクラスの外で操作できず、上記のコードは自動的に __get() メソッドと __set() メソッドを呼び出すため、プログラムは誤動作します。カプセル化されたプライベート メンバーに直接アクセスできるようにしてください。