首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -扩展类

PHP -扩展类
EN

Stack Overflow用户
提问于 2012-06-26 01:45:20
回答 2查看 36.3K关注 0票数 12

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

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

父类:

代码语言:javascript
复制
 class DatabaseObject { 

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

子类:

代码语言:javascript
复制
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文件访问此表中的所有信息的代码:

代码语言:javascript
复制
$topics=Topics::find_all();

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

正如您所看到的,大多数代码还没有合并到新的工作方式中。我需要更改self::$table_name,它不再以新的方式工作。我将有大约5个类来扩展这个对象,那么最好的编码方式是什么,这样我就可以用一个方法访问不同的表(而不是将这个find_all()方法包含在5个不同的类中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 02:12:11

您可以尝试将延迟静态绑定作为mentioned below,或者单例解决方案也可以:

代码语言:javascript
复制
<?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();
票数 31
EN

Stack Overflow用户

发布于 2012-06-26 02:00:37

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11194506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档