12

オブジェクト指向の PHP で非常に多くのコードを作成してきましたが、これまで、私のクラスはすべて「特異」でした。私はいくつかのクラス (5 つほどの同一のメソッドを持つ) を変更して、1 つのクラスを拡張しようとしています (重複したコードを取り除くため)。いくつかの問題が発生しています。

親クラスのメソッドにアクセスしようとしていますが、問題が発生しています。

親クラス:

 class DatabaseObject { 

     public static function find_all() {
        return self::find_by_sql("SELECT * FROM " . self::$table_name);
    }
}

子クラス:

class Topics extends DatabaseObject {

    protected static $table_name = "master_cat";
    protected static $db_fields = array('cat_id', 'category');
    public $cat_id;
    public $category;

  }

php/html ファイルからこのテーブルのすべての情報にアクセスしようとするコード:

$topics=Topics::find_all();

foreach($topics as $topic):
    echo $topic->category;
endforeach; 

ご覧のとおり、ほとんどのコードは新しいやり方にマージされていません。私がやっている新しい方法では機能しなくなった self::$table_name を変更する必要があります。このオブジェクトを拡張する約 5 つのクラスがあるため、これをコーディングして 1 つのメソッドで異なるテーブルにアクセスできるようにする最善の方法は何ですか (この正確な find_all() メソッドを 5 つの異なるクラスに含めるのではなく)。

4

2 に答える 2

31

下記のように遅延静的バインディングを試すことができます。または、シングルトン ソリューションも同様に機能するはずです。

<?php
abstract class DatabaseObject {
  private $table;
  private $fields;

  protected function __construct($table, $fields) {
    $this->table = $table;
    $this->fields = $fields;
  }

  public function find_all() {
    return $this->find_by_sql('SELECT * FROM ' . $this->table);
  }
}

class Topics extends DatabaseObject {
  private static $instance;

  public static function get_instance() {
    if (!isset(self::$instance)) {
      self::$instance = new Topics('master_cat', array('cat_id', 'category'));
    }

    return self::$instance;
  }
}

Topics::get_instance()->find_all();
于 2012-06-25T18:12:11.163 に答える
5

PHPのLate Static Bindingの概念を調べる必要があります。これにより、呼び出されたクラスから静的定数または関数にアクセスできます。

于 2012-06-25T18:00:36.830 に答える