3

可能重复:
PHP get_class 的功能

对于一个小的 ORM-ish 类集,我有以下内容:

class Record {
  //Implementation is simplified, details out of scope for this question.
  static public function table() {
    return strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', get_class()))."s";
  }

  static public function find($conditions) {
    //... db-selection calls go here.
    var_dump(self::table());
  }
}

class Payment extends Record {
}

class Order extends Record {
  public $id = 12;
  public function payments() {
    $this->payments = Payment::find(array('order_id', $this->id, '='));
  }
}

$order = new Order();
$order->payments();
#=> string(7) "records"

希望这段代码能打印出来:

#=> string(8) "payments"

但是,相反,它打印records. 我试过self::table()了,但结果是一样的。

编辑,在评论中的一些问题之后 table()是一种方法,它只是将类的名称映射到其对象所在的表:Order生活在ordersPayment生活在paymentsrecords 不存在!)。当我打电话时Payments::find(),我希望它在桌子上搜索payments,而不是在桌子上records,也不在桌子上orders

我究竟做错了什么?如何获取调用 ::is 的类的类名,而不是定义 is 的类?

重要的部分可能是get_class(),无法返回正确的类名。

4

1 回答 1

4

如果您使用的是 php 5.3 或更高版本,则可以使用get_call_class 。它为您提供调用静态方法的类,而不是实际定义该方法的类。

更新

您需要调用“find”的类的类名。您可以在 find 方法中获取类名并将其作为参数提供给表(可能将其重命名为 getTableForClass($class))方法。get_call_class 将为您提供 Payment 类,表方法派生表名并返回它:

class Record {
    //Implementation is simplified, details out of scope for this question.
    static public function getTableForClass($class) {
        return strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $class))."s";
    }

    static public function find($conditions) {
        //... db-selection calls go here.
        $className = get_called_class();
        $tableName = self::getTableForClass($class);

        var_dump($tableName);
    }
 }
于 2012-09-13T13:58:22.547 回答