12

我已经用 PHP 编写了很多面向对象的代码,但到目前为止,我所有的类都是“单一的”,我想你可以称之为。我正在更改几个类(有 5 个左右相同的方法)以扩展一个类(以摆脱重复的代码)。我遇到了一些问题。

我正在尝试访问父类中的方法,但您可以看到问题。

父类:

 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 个类扩展这个对象,那么最好的编码方法是什么,这样我就可以用一种方法访问不同的表(而不是在 5 个不同的类中包含这个确切的 find_all() 方法。

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中后期静态绑定的概念。这允许您从被调用的类中访问静态常量或函数。

于 2012-06-25T18:00:36.830 回答