我也贴个答案吧,通过问题的描述,我想了下应用场景可能是 自己写了一个类,别人继承的时候,不能声明父类中指定的属性,但是可以读,或 写。所以只能在父类中做手脚了,如下代码:
class a {
public $attr2 = 'a';
private $final_attr = '1';
function __construct() {
$vars = get_class_vars(get_class($this));
foreach($vars as $k => $val) {
if(substr($k,0,strlen('final_')) == 'final_') continue;
$v = 'final_'.$k;
if(isset($this ->$v )) {
echo 'class : ' . get_class($this) . " Can't declare parent's attribute!";
exit();
}
}
}
function __set($attr,$val) {
$v = 'final_'.$attr;
if(isset($this -> $v)) {
$this -> $v = $val;
}
}
function __get($k) {
$v = 'final_'.$k;
if(isset($this -> $v)) {
return $this -> $v;
}
}
}
class b extends a {
public $attr = 'b';
function __construct() {
parent::__construct();
}
}
$a = new b();
说明:
1 父类中定义不让子类重新声明的属性时 需要加 private 修饰。
2 父类中定义不让子类重新声明的属性时 变量的格式为 final_ + 变量名
3 子类访问父类中的 final 属性时, 直接 $this -> 变量名即可,不需要 写成
$this -> final_ + 变量名
4 子类中允许定义 final_ + 变量名 且变量名 与 父类完全相同 的属性,但是不允许定义 父类中 final_xxx , 子类为 xxx 属性的定义
5 以上规则是我定的,可以随意的合理修改。