对于一个小的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
生活在orders
,Payment
住在payments
; records
不存在!)。当我致电Payments::find()
时,我希望它能够在表payments
上搜索,而不是在表records
上搜索,也不会在表orders
上搜索。
我做错了什么?如何获取调用::的类的类名,而不是定义了哪个类?
重要的部分可能是get_class()
,无法返回正确的类名。
答案 0 :(得分:4)
如果您使用的是php 5.3或更高版本,则可以使用get_called_class。它为您提供了调用静态方法的类,而不是实际定义方法的类。
<强>更新强>
您需要找到&#39;找到&#39;的班级的班级名称。叫做。您可以在find方法中获取类名,并将其作为参数提供给表(可能将其重命名为getTableForClass($ class))方法。 get_called_class将为您提供Payment类,table方法派生表名并返回它:
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);
}
}