PHP:通过核心类/函数强制在不同的命名空间中使用扩展类

时间:2014-07-25 04:27:19

标签: php mongodb namespaces

后台(虽然我的问题可以推广):我想将Mongo核心类与PhpRbac(基于角色的身份验证)集成,以添加额外的安全层来限制对特定数据库的访问和收藏品。例如如果代码尝试访问集合“dbname.foo.bar.baz”,它将检查是否存在PhpRbac权限“/ mongo / dbname / foo / bar / baz”并确保当前用户具有权限。

我想强制核心MongoClient::selectDB()函数返回MongoDB的扩展版本而不是通常的核心MongoDB

e.g。

(1)定义MongoDB

的扩展版本
namespace MyUniqueNamespace;

class MongoDB extends \MongoDB {

  public function __construct(){
    die("We're definitely using the extended version!");
  }

  public function someStandardFunction(){
    authoriseOrThrowException();
    return parent::someStandardFunction();
  }

}

(2)强制核心MongoClient(不修改核心)使用\MyUniqueNameSpace\MongoDB代替MongoDB。使用useuse ... as MongoDB并不能解决问题:(

use \MyUniqueNameSpace\MongoDB;
$cl = new MongoClient();
$db = $cl->selectDB("dbname"); //would die if it was using the extended function

有人能提出一种实现这一目标的方法吗? PHP不能作为一个不同的类进行转换,我不想开始重写Mongo类,因为这是我在将PhpRbac与其他功能集成时会遇到的一般问题。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您应该在MongoClient类中添加以下use语句,而不是在您调用它的位置:

use \MyUniqueNameSpace\MongoDB;