3

重複の可能性:
PHP get_class の機能

小さなORM風のクラスセットの場合、次のものがあります。

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メソッドです。存在しません!)。を呼び出すと、テーブルではなく、テーブルでも、テーブルでも検索されることを期待しています。ordersPaymentpaymentsrecords Payments::find()paymentsrecordsorders

私は何を間違っていますか?::が定義されたクラスではなく、::が呼び出されたクラスのクラス名を取得するにはどうすればよいですか?

重要な部分はおそらくget_class()、適切なクラス名を返すことができないことです。

4

1 に答える 1

4

php 5.3以降を使用している場合は、 get_called_classを使用できます。これは、メソッドが実際に定義されているクラスではなく、静的メソッドが呼び出されるクラスを提供します。

アップデート

'find'が呼び出されるクラスのクラス名が必要です。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);
    }
 }
于 2012-09-13T13:58:22.547 に答える