PHP-расширение класса

Я сделал много и много кода на 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 классов, расширяющих этот объект, так что лучший способ кодирования этого, чтобы я мог получить доступ к различным таблицам с помощью одного метода (а не включать этот точный find_all() метод в 5 различных классах.

2 ответов


вы можете попробовать позднюю статическую привязку как указанных ниже, или одноэлементное решение также должно работать:

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

вы должны изучить концепцию Поздняя Статическая Привязка в PHP. Это позволяет получить доступ к статической константе или функции из класса, который был вызван.