【问题标题】:PHP - Extending ClassPHP - 扩展类
【发布时间】:2012-06-27 00:19:48
【问题描述】:

我已经用 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() 方法。

【问题讨论】:

  • 我建议您阅读有关 OOP 的更多信息,尤其是它在 PHP 中的实现方式。给你一个工作代码并不能解决真正的问题。
  • 相反,我是通过别人的代码来学习的。也许我现在会等待有人真正回答这个问题。
  • 我经常阅读“我从其他人的代码中学习”,以至于不知道它不能很好地工作。你应该考虑读一本书。
  • 垃圾链接:onetwothreefour
  • 我认为这个问题没有错,只是没有人有答案。但是感谢@Matthijs,我们得到了启发

标签: php class extends object-oriented-database


【解决方案1】:

您可以尝试像mentioned below 那样进行后期静态绑定,或者单例解决方案也可以:

<?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();

【讨论】:

  • +1 教我们,让每个(去读这本书)人闭嘴
【解决方案2】:

您应该在 PHP 中研究Late Static Binding 的概念。这允许您从被调用的类中访问静态常量或函数。

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2013-02-06
    • 2017-01-09
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多