限制哪些类可以扩展另一个类

时间:2011-01-05 08:31:29

标签: php

我目前正在编写一个包含一些抽象类的解决方案。其中一个应该只从其他几个类扩展,因为从其他地方使用它可能会造成一些混乱。所以我想要做的是限制哪些类可以扩展这个类。

因此,如果我有一个名为ImportantStuff的类是抽象的,我想说只有A类和B类能够扩展它,而其他任何类都不能。

你可能想知道我为什么要做这样的事情。那么代码是为了工作而编写的,所以稍后会有很多其他程序员使用它,所以我希望明确表示这个类不打算从其他任何地方使用它。是的我知道我可以在类描述中写它而且我有,但我想通过阻止它100%清楚,因为并非所有程序员都擅长阅读评论:)我也有点好奇,如果它可以在一个好时尚,因为我在网上找不到一个好的答案。

所以我的问题是:实现这一目标的最佳方法是什么?我想我可以发送一个或者在构造函数中处理的东西,但是有更简洁的方法吗?

4 个答案:

答案 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 } 中也可以完成这个....