0

我正在使用 PHP 的重载,我想要做的是;当我调用对象时,它看起来像这样。

$obj->person->name->function();

为此,我使用 __get 和 __call 函数。它们看起来像这样:

function __get($field){
    return $this;
}

但是,我想知道 person 和 name 的变量名,因为它可以随时改变。我试着这样做:

function __get($field){
    $array[] = $field;
    return new object($array);
}

他们被保存了,但是当我添加另一行时,它只是将它添加到数组中。调用函数后它不会清理。我试图在 __call 处清空数组,但这没有帮助。我想谷歌这个,但到目前为止..我不走运。

PHP中是否有本机函数?

——阅读太多?停在这里,剩下的只是更多的解释——

但是 __call 发送数组并将您发送到另一个处理真实函数的类。

原因: 我有 5 个程序员习惯了 mongoDB 类,我们正在将大型代码库从 MongoDB 更改为另一个 DB。通过此修复,我们将能够一次更改整个代码库的数据库,而无需麻烦地构建查询。我们只是在函数类中进行查询。(调用 __call 时访问)。但是,今天的数据库查询的典型行如下所示:

$this->db->accounts->update(<array>);

这条线连接到一个数据库,在该数据库内它连接到帐户。但是,我们有一些“特殊”变量,例如 $core。它看起来像这样:

$this->db->core->accounts->update(<array>);

那个不连接到同一个数据库。

我们需要的是能够在对象内部构建一行对象,这是动态的。它需要找到所调用的名称,因此我们可以将它们放入查询中。仅适用于一条线路,而不是所有线路。它基本上是基于密钥的数据库上的基于文档的基础架构,有很多黑客攻击。:-D

非常感谢!

4

1 回答 1

0

您需要在访问该属性时返回一个不同的对象。

class TempObj{
  public $table;

  public $db;

  public function __call($name,$arguments){
    switch($name){
      case "update":
        $this->db->query("UPDATE ......");
      break;
    }
  }
}

在你的DB课上

public function __get($name){
  $obj = new TempObj;
  $obj->table = $name;
  $obj->db =& $this;
  return $obj;
}

这样,当您这样做时$this->db->accounts,它将返回可以处理__call此重载属性的方法的对象。

于 2012-05-24T03:15:54.043 回答