2012-06-25 20 views
8

Zrobiłem dużo i dużo kodu w PHP, który jest zorientowany obiektowo, ale do tej pory wszystkie moje klasy były "pojedyncze", przypuszczam, że możesz to nazwać. Jestem w trakcie zmiany kilku klas (które mają 5 identycznych metod), aby rozszerzyć jedną klasę (aby pozbyć się duplikatu kodu). Występuję w kilku kwestiach.PHP - Rozszerzanie klasy

Próbuję uzyskać dostęp do metody w klasie nadrzędnej, ale można zobaczyć problem.

klasa

nadrzędny:

class DatabaseObject { 

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

Klasa dziecka:

class Topics extends DatabaseObject { 

    protected static $table_name = "master_cat"; 
    protected static $db_fields = array('cat_id', 'category'); 
    public $cat_id; 
    public $category; 

    } 

kod próbuje uzyskać dostęp do wszystkich informacji z tej tabeli z php pliku/html:

$topics=Topics::find_all(); 

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

Jak widać , Większość kodu nie została połączona z nowym sposobem robienia rzeczy. Muszę zmienić self :: $ table_name, która nie działa już w nowy sposób, w jaki robię. Będę miał około 5 klas rozszerzających ten obiekt, więc jaki jest najlepszy sposób kodowania tego, abym mógł uzyskać dostęp do różnych tabel za pomocą jednej metody (zamiast włączania tej dokładnej metody find_all() w 5 różnych klasach:

+0

Polecam, aby przeczytać więcej o OOP, a zwłaszcza o sposobie jego implementacji w PHP. ng ci działający kod nie rozwiąże prawdziwego problemu. – Adi

+11

Wręcz przeciwnie, uczę się przez kod innych ludzi. Być może będę czekał, aż ktoś rzeczywiście odpowie na to pytanie. – KickingLettuce

+0

Przeczytałem "Uczę się z kodu innych ludzi" zbyt często, aby wiedzieć, że to nie działa dobrze. Powinieneś rozważyć przeczytanie książki. – KingCrunch

Odpowiedz

18

można spróbować późno statyczne wiązanie jak mentioned below lub rozwiązanie Singleton powinien działać jak dobrze.

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

+1 za cierpliwość – Adi

+8

+1 za nauczanie nas, i robienie wszystkiego (przeczytaj książkę) ludzie zamykają się – Ibu

2

Powinieneś wyglądać . pod pojęciem Late Static Binding w PHP To pozwala na dostęp do statycznego stała lub funkcję z klasy, która została wywołana