文章主要介紹了PHP獲取對象屬性的三種方法,結合實例形式分析了php面向對象程序設計中獲取對象屬性的常見操作技巧,需要的朋友可以參考下。
PHP獲取對象屬性的三種方法,具體如下:
今天查看yii源碼,發現yii\base\Model中的attribute()方法是通過反射獲取對象的public non-static屬性。記得以前看到的代碼都是用get_object_vars()這個函數獲取的,昨天查看php文檔,發現還可以用foreach遍歷對象屬性。于是寫個例子練習下。
classTestClass {private$a;protected$b;public$c;public$d;publicstatic$e;privatefunctionfuncA() {}protectedfunctionfuncB() {}publicfunctionfuncC() {}publicfunctiongetPropertyMethodOne() {echo"[get_object_vars]", PHP_EOL;$vars= get_object_vars($this);foreach($varsas$k=>$v) {echo$k,' => ',$v, PHP_EOL;}}publicfunctiongetPropertyMethodTwo() {echo"[foreach object]", PHP_EOL;foreach($thisas$k=>$v) {echo$k,' => ',$v, PHP_EOL;}}publicfunctiongetPropertyMethodThree() {echo"[reflection]", PHP_EOL;$class=newReflectionClass($this);foreach($class->getProperties(ReflectionProperty::IS_PUBLIC)as$property) {if(!$property->isStatic()) {echo$property->getName(),' => ',$property->getValue($this), PHP_EOL;}}}}
測試代碼一
$obj=newTestClass();echo"[get_object_vars]", PHP_EOL;$vars= get_object_vars($obj);foreach($varsas$k=>$v) {echo$k,' => ',$v, PHP_EOL;}echo"[foreach object]", PHP_EOL;foreach($objas$k=>$v) {echo$k,' => ',$v, PHP_EOL;}echo"[reflection]", PHP_EOL;$class=newReflectionClass($obj);foreach($class->getProperties(ReflectionProperty::IS_PUBLIC)as$property) {if(!$property->isStatic()) {echo$property->getName(),' => ',$property->getValue($obj), PHP_EOL;}}
輸出:
[get_object_vars]
c =>
d =>
[foreach object]
c =>
d =>
[reflection]
c =>
d =>
可見,當著三種方法用在類的外部時,結果是一樣的。get_object_vars()和foreach是獲取到的是對象的public non-static屬性,而通過反射的話則需要手動篩選出public non-static屬性。
測試代碼二
$obj=newTestClass();$obj->getPropertyMethodOne();$obj->getPropertyMethodTwo();$obj->getPropertyMethodThree();
輸出
[get_object_vars]
a =>
b =>
c =>
d =>
[foreach object]
a =>
b =>
c =>
d =>
[reflection]
c =>
d =>
可見,get_object_vars()和foreach用在類內部時,private、protected、public的實例屬性都能獲取到。反射就不用說了,通過手動篩選,各種類型的屬性都能獲取到。
分享到:
投訴收藏














