一个简单的类:
<?php
class base {
private $private_var;
protected $protected_var;
public $public_var;
public function __construct($property_name, $value = FALSE) {
$this->_set($property_name, $value);
}
private function _set($property_name, $value = FALSE) {
$this->$property_name = $value;
}
public function get($property_name) {
if(property_exists('base', $property_name)) {
return $this->$property_name;
}
return NULL;
}
}
测试文件:
#! /usr/bin/php
<?php
require('./base.class.php');
$base = new base('foo');
var_dump($base);
var_dump(property_exists('base', 'protected_var'));
var_dump(property_exists('base', 'foo'));
var_dump(isset($base->foo));
测试结果:
class base#1 (4) {
private $private_var =>
NULL
protected $protected_var =>
NULL
public $public_var =>
NULL
public $foo =>
bool(false)
}
bool(true)
bool(false)
bool(true)
以上结果说明向实例化的类中增加的公共属性,无法通过property_exists检测存在,那么只能通过isset检测。
但是,isset有一个明显缺点,即不能检测private和protected的属性。
解决办法应该是两个一起用,先使用property_exists, 然后使用isset。