我目前正在编写一个包含一些抽象类的解决方案。其中一个应该只从其他几个类扩展,因为从其他地方使用它可能会造成一些混乱。所以我想要做的是限制哪些类可以扩展这个类。
因此,如果我有一个名为ImportantStuff的类是抽象的,我想说只有A类和B类能够扩展它,而其他任何类都不能。
你可能想知道我为什么要做这样的事情。那么代码是为了工作而编写的,所以稍后会有很多其他程序员使用它,所以我希望明确表示这个类不打算从其他任何地方使用它。是的我知道我可以在类描述中写它而且我有,但我想通过阻止它100%清楚,因为并非所有程序员都擅长阅读评论:)我也有点好奇,如果它可以在一个好时尚,因为我在网上找不到一个好的答案。
所以我的问题是:实现这一目标的最佳方法是什么?我想我可以发送一个或者在构造函数中处理的东西,但是有更简洁的方法吗?
答案 0 :(得分:4)
嗯,让构造函数最终(但是添加一个init函数)并检查当前哪个类被编译,这可能,但至少需要php 5.3
abstract class bigOne{
private $_allowedClasses = array('smallOne');
final public function __construct() {
if(!in_array(get_called_class(), $this->_allowedClasses)){
throw new Exception('can not extend to Class: ' . get_called_class());
}
$this->init();
}
abstract public function init();
}
class smallOne extends bigOne{
public function init(){
}
}
class badOne extends bigOne{
public function init(){
}
}
$oSmallOne = new smallOne();
$obadOne = new badOne();
答案 1 :(得分:3)
仅 PHP 5.3+ 的可能解决方案:
class Toto {
function __construct() {
// list of classes that can extend Toto, including itself obviously:
if(!in_array(get_called_class(), array(__CLASS__, 'Foo')))
exit(get_called_class() . " cannot extend " . __CLASS__ . "\n");
echo "Success\n";
}
}
class Foo extends Toto {}
class Bar extends Toto {}
new Toto;
new Foo;
new Bar;
返回:
成功
成功
酒吧无法延伸托托
注意:如果构造函数被覆盖,这会不。
答案 2 :(得分:1)
我不认为这是可能的。每个类都可以被任何其他类扩展。
如果要限制扩展抽象类的类,可以使用白名单制作最终方法。我认为这是一个肮脏但可以接受的解决方案。
请注意,您正在与那些认为自己是专业开发人员的人合作。如果是,他们应该阅读文档。要防止他们犯这样的错误是不可能的。如果他们不阅读文档,他们可以打开您的抽象类,只需将他们的类添加到白名单。结论:这不是你应该在你的代码中处理的东西,而是你同事的纪律。
答案 3 :(得分:0)
我想您可以使用数据库来完成此任务。
将class name
的{{1}}列表放在这样的
extendable class
然后在代码中使用此数据来查看某个类是否可扩展
可能是一个样本
-------------------------------------------------------------------
Class | Extendable class
-------------------------------------------------------------------
child 1 | parent1,parent2,parent3
---------------------------------------------------------------
你也可以使用普通文件或xml来存储类名而不是数据库,或者将它们存储在$extendableClass = explode(',',$datarow['extendable class']);
$toextendClass = "parent4";
if(in_array($toextendClass,$extendableClass)) {
//extend
}
else {
//dont extend
}
中也可以完成这个....