php - 使用范围解析运算符 (::) 时获取继承类的类名

标签 php oop scope-resolution

<分区>

Possible Duplicate:
Functionality of 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存在于orders中,Payment存在于payments中; 记录 不存在!)。当我调用 Payments::find() 时,我希望它在表 payments 上搜索,而不是在表 records 上,也不在表 订单

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

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

最佳答案

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

更新

您需要调用“查找”的类的类名。您可以在 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);
    }
 }

关于php - 使用范围解析运算符 (::) 时获取继承类的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12407764/

相关文章:

php - 让 PHP 使用 MySQL 进行 session 而不是平面文件的简单方法?

php - mysql 和 localhost 之间的时间差异?

c++ - 好友、运算符关键字和范围解析

php - Laravel 5.1 如何在表单验证错误信息中输出 HTML

javascript - 更改我的 .htaccess 后,我的 Css An Js 无法正常工作

javascript - 如何从 JavaScript 中同一对象中的另一个方法调用方法?

java - 领域模型金融交易应用

ruby - 将类和方法与用户输入一起用于交互式程序

c++ - 将类声明为整数

java - Java中类名后的冒号是做什么用的