欺瞞を防ぐための php __set __get __isset __unset の使用法分析
皆さん、こんにちは、Xiaoyan です。今日は、欺瞞を防ぐための PHP オブジェクト指向における __set __get __isset __unset の使用法について紹介します。 🎜>
全文注意=========================== ======== ==
__set __get __isset __unset これらのメソッドは古いバージョンの PHP では private に設定できますが、現在のphpバージョンではprivateに設定しない方が良いですが、staticメソッドに設定した場合は正常に値を返すことができますが、エラーが発生します。 警告 警告です! ! (php5.5バージョンを使用しています)
の始まりtext= =====================================
PHP オブジェクト指向では __set __get __isset __unset などの使用法をよく見かけますが、なぜこれらが使用されるのか理解できません。次にやってみましょう。兄弟の使い方を一つずつ紹介していきましょう。
一般的に言えば、クラス属性は常にプライベートとして定義され、これは現実的なロジックにより一致します。ただし、属性の読み取りと割り当ての操作は非常に頻繁に行われるため、PHP5 では、属性を取得して割り当てるための 2 つの関数「__get()」と「__set()」、および属性を確認するための「__isset」が事前定義されています。 )」と属性を削除するメソッド「__unset()」。
PHP5 では、値を設定するための特別なメソッドが提供されています。値を取得するメソッドは「__set()」と「__get()」の2つのメソッドです。この2つのメソッドはデフォルトでは存在せず、コンストラクタメソッド(__construct())と同様に手動でクラスに追加されます。 . は、クラスに追加された場合にのみ存在します。 もちろん、これら 2 つのメソッドは、
の方法で追加することもできます。public function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name); }else{ return(NULL); }}//__set()方法用来设置私有属性public function __set($property_name, $value){ $this->$property_name = $value;}
基本的に __get() に関するインターネット上の記事の 99% がこれを述べていますが、私は が最も重要だとも言います。重要なのは、 __get() は 現在のクラス のプライベート メンバー変数を取得するだけでなく、インスタンス化などの他の操作もこのメソッドで実行できることです。別のクラスのオブジェクトを取得するには、別のクラスを使用します。 以下のコードを参照してください
public function __get($name) { return \Libs\Components::getInstance()->$name; }
这里 如果 获取name 并不是获取当前类的 私有属性 而且静态调用 Components类 里面的 $name 属性 所以 __get 方法一定要灵活运用 还有就是 __get() 方法不只是调用当前类的私有变量
public function __get($name) { if(isset($this->config[$name])) { return $this->config[$name]; } return null; }
甚至 还能在类里面用 请看下面代码
class b { private $config = ['aa'=>'小烟']; public function __get($key) { if($this->config[$key]) return $this->config[$key]; } public function __construct() { echo $this->aa; } }$b = new b(); //输出 小烟
__set()方法:这个方法也是用来获得你指定的变量 一般来讲都是获取类里面的私有变量,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。,
如果没有__set()这个方法,是不允许直接获取私有变量的,比如:$this->name='zhangsan', 这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值"zhangsan"传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下:
<?php class Person{ private $name; private $sex; private $age; private function __get($property_name){ echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; if (isset($this->$property_name)) { return ($this->$property_name); } else { return null; } } private function __set($property_name, $value) { echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; $this->$property_name = $value; }}$p1 = new Person();$p1->name = "小烟";$p1->sex = "男";$p1->age = 23;echo "姓名:".$p1->name."<br>";echo "性别:".$p1->sex."<br>";echo "年龄:".$p1->age."<br>";
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值在直接获取私有属性值的时候,自动调用了这个__get()方法姓名:小烟在直接获取私有属性值的时候,自动调用了这个__get()方法性别:男在直接获取私有属性值的时候,自动调用了这个__get()方法年龄:23
以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。
__isset() 方法:在看这个方法之前我们看一下"isset()"函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。
那么如果在一个对象外面使用"isset()"这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用"isset()"函数来测定私有成员属性是否被设定了呢?
答案是可以的,你只要在类里面加上一个"__isset()"方法就可以了,当在类外部使用"isset()"函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的"__isset()"方法了帮我们完成这样的操作,"__isset()"方法也可以做成私有的。你可以在类里面加上下面这样的代码就可以了:
private function __isset($nm){ echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用<br>"; return isset($this->$nm);}
在对象里面加上了"__unset()"这个方法之后,在对象外部使用"unset()"函数删除对象内部的私有成员属性时,自动调用"__unset()"函数来帮
我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。在对象里面加上下面的代码就可以了:
private function __unset($nm){ echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm);}
<?phpclass Person { private $name; private $sex; private $age; public function __get($property_name) { if(isset($this->$property_name)) { return ($this->$property_name); } else { return (NULL); } } public function __set($property_name, $value) { $this->$property_name = $value; } public function __isset($nm) { echo "isset()函数测定私有成员时,自动调用<br>"; return isset($this->$nm); } public function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm); }}$p1 = new Person();$p1->name = "this is a person name";echo var_dump(isset($p1->name))."<br>";echo $p1->name."<br>";unset($p1->name);echo $p1->name;
isset()函数测定私有成员时,自动调用
最後に、Xiaoyan は、これら 4 つのメソッドの使用法は非常に柔軟であることを思い出してもらいたいと思います。クラス内でのみプライベート変数を取得できると考えないでください。クラス内の特定のメンバー変数の値、または他のクラスの値を自由に展開できます。 誤解しないでください。 !
小さな煙 2014-12-03 転載の際は出典を明記してください。