本文實例講述了PHP獲取對象屬性的三種方法。分享給大家供大家參考,具體如下:
今天查看yii源碼,發(fā)現(xiàn)yii\base\Model中的attribute()
方法是通過反射獲取對象的public non-static屬性。記得以前看到的代碼都是用get_object_vars()
這個函數(shù)獲取的,昨天查看php文檔,發(fā)現(xiàn)還可以用foreach遍歷對象屬性。于是寫個例子練習(xí)下。
class TestClass {
private $a;
protected $b;
public $c;
public $d;
public static $e;
private function funcA() {
}
protected function funcB() {
}
public function funcC() {
}
public function getPropertyMethodOne() {
echo "[get_object_vars]", PHP_EOL;
$vars = get_object_vars($this);
foreach ($vars as $k => $v) {
echo $k, ' => ', $v, PHP_EOL;
}
}
public function getPropertyMethodTwo() {
echo "[foreach object]", PHP_EOL;
foreach ($this as $k => $v) {
echo $k, ' => ', $v, PHP_EOL;
}
}
public function getPropertyMethodThree() {
echo "[reflection]", PHP_EOL;
$class = new ReflectionClass($this);
foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
if (!$property->isStatic()) {
echo $property->getName(), ' => ', $property->getValue($this), PHP_EOL;
}
}
}
}
測試代碼一
$obj = new TestClass();
echo "[get_object_vars]", PHP_EOL;
$vars = get_object_vars($obj);
foreach ($vars as $k => $v) {
echo $k, ' => ', $v, PHP_EOL;
}
echo "[foreach object]", PHP_EOL;
foreach ($obj as $k => $v) {
echo $k, ' => ', $v, PHP_EOL;
}
echo "[reflection]", PHP_EOL;
$class = new ReflectionClass($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 =>
可見,當著三種方法用在類的外部時,結(jié)果是一樣的。get_object_vars()
和foreach是獲取到的是對象的public non-static屬性,而通過反射的話則需要手動篩選出public non-static屬性。
測試代碼二
$obj = new TestClass();
$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用在類內(nèi)部時,private、protected、public的實例屬性都能獲取到。反射就不用說了,通過手動篩選,各種類型的屬性都能獲取到。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- PHP簡單遍歷對象示例
- PHP var_dump遍歷對象屬性的函數(shù)與應(yīng)用代碼
- php面向?qū)ο笾衧tatic靜態(tài)屬性和靜態(tài)方法的調(diào)用
- php中類和對象:靜態(tài)屬性、靜態(tài)方法
- PHP實現(xiàn)在對象之外訪問其私有屬性private及保護屬性protected的方法
- php面向?qū)ο笾衧tatic靜態(tài)屬性與方法的內(nèi)存位置分析
- PHP實現(xiàn)刪除多重數(shù)組對象屬性并重新賦值的方法
- PHP 5.0對象模型深度探索之屬性和方法
- PHP中的Iterator迭代對象屬性詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計之對象的遍歷操作示例