php的final修饰类,PHP-在PHP的类中如何对属性实现类似final的功能?

博客介绍了如何在PHP中防止子类重声明父类的特定属性。父类使用`private`关键字定义`final_`前缀的属性,子类试图声明这些属性时会触发错误。子类仍能通过`__set`和`__get`魔术方法访问和修改这些属性。这种设计确保了属性的不可变性,同时提供了读写访问。
摘要由CSDN通过智能技术生成

我也贴个答案吧,通过问题的描述,我想了下应用场景可能是 自己写了一个类,别人继承的时候,不能声明父类中指定的属性,但是可以读,或 写。所以只能在父类中做手脚了,如下代码:

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 以上规则是我定的,可以随意的合理修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值