PHP - 扩展类

13
我已经写了很多 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()方法)。


我建议你多了解面向对象编程,特别是它在PHP中的实现方式。给你一个可用的代码并不能解决真正的问题。 - Adi
25
相反,我是通过学习别人的代码来提高自己。也许我会等待有人真正回答这个问题。 - TheLettuceMaster
1
链接垃圾邮件: - jedwards
但是你打算通过浏览代码来学习理论概念吗?你意识到你正在尝试从父级访问子属性吗?你没有根据它们与类的关系组织你的方法。相信我,我们都想在这里帮助你,但没有人会为你写一本书作为答案。放松一下,读一本书。如果不行,那就阅读一些PHP OOP教程。 - Adi
4
我认为问题本身并没有错,只是没有人知道答案。但多亏了@Matthijs,我们现在有了启示。 - Ibu
显示剩余4条评论
2个回答

32

您可以像下面提到的那样尝试使用后期静态绑定,或者单例模式也应该可以解决问题:

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

17
+1 鼓励我们学习,让那些不懂的人闭嘴(去读书)。 - Ibu

5
你应该了解PHP中的"Late Static Binding"(晚期静态绑定)的概念。它允许你从被调用的类中访问静态常量或函数。请参考PHP手册

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接