Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Prefix tabel
Forum PHP.pl > Forum > PHP > Frameworki
misiek08
Witam!
Nie jestem tak mocno "obkuty" w obiektowym programowaniu, a widzę (wg mnie wykonalny) prosty sposób na możliwość ustawienia prefix'u table w ZF.
Kod przykładowego modelu wygląda tak:
  1. <?php
  2. class Album extends Zend_Db_Table {
  3. protected $_name = 'kategorie';
  4. }


Wiem, że abstract pozwala rozbudować klasę (ja to tak rozumiem). Tak więc, czy nie można zrobić czegoś takiego np. w Bootstrap.php:
  1. abstract class Zend_DB_Table {
  2. protected function _setupTableName (){
  3. $this->_name = TABLE_PREFIX . $this->_name;
  4. }
  5. }
yevaud
fajnie byloby ten prefix z configa pobierac winksmiley.jpg
misiek08
W pliku Bootstrap definiuję TABLE_PREFIX. Chodzi mi czy taka konstrukcja działa. Nie mam niestety jak jej przetestować, bo dopiero jutro będę miał dane FTP do strony. Nie używałem wcześniej abstract'a.


EDIT:
Z tego co szukałem w internecie widzę, że abstract służy do czegoś innego. Moim problemem jest chęć nadpisania metody _setupTableName z klasy Zend_DB_Table tak, aby każdy obiekt tej klasy miał automatycznie dodawany prefix do nazwy.
yevaud
abstract uzywasz wtedy gdy chcesz "zamarkowac", ze dana klasa ma miec jakas konkretna metode, ale nie mozesz jeszcze napisac jej kodu

np.

  1. abstract class AbstractClass
  2. {
  3. abstract protected function costam();
  4. }


kazda klasa ktora ma chociaz jedna metode abstrakcyjna, musi byc abstrakcyjna - wynika tez z tego ze jesli dziedziczysz po klasie abstrakcyjnej i nie pokryjesz jej abstrakcynych metod, to wlasnie tworzysz nastepna klase abstrakcyjna smile.gif
oczywiscie nie mozesz tworzyc obiektow klasy abstrakcyjnej winksmiley.jpg poniewaz maja one metody ktore nie maja implementacji wiec nie moga sie wykonac smile.gif

klasy abstrakcyjne maja sens wtedy gdy tworzysz klasy dziedziczace po nich, wtedy:
1. narzucasz ze pewne metody musza miec implementacje, jesli ktos chce tworzyc normalne obiekty
2. dzieki temu ze interpreter wie, ze AbstractClass ma jakas metode, mozesz uzywajac polimorfozmu traktowac klasy dziedziczace po AbstractClass, jak instancja obiektu AbstractClass i wtedy odwolywac sie normalnie do jej metod abstrakcyjnych

http://php.net/manual/en/language.oop5.abstract.php
misiek08
A na mój problem jakie lekarstwo? Po prostu chciałbym zmodyfikować istniejąca klasę, ale bez ingerowania w jej oryginalny kod.
yevaud
Twoja technika ma sens jesli zrobisz sobie klase ktora dziedziczy po Zend_DB_Table i nazywa sie np. "Misiek_Db_Table", dodaje tam co trzeba, a Ty dziedziczysz swoimi tabelami po Misiek_Db_Table
misiek08
Czyli:
  1. class Misiek_Db_table extends Zend_Db_Table {
  2. protected function setupTableName(){
  3. $this->_name = TABLE_PREFIX . $this->_name;
  4. }
  5. }
  6. class Album extends Misiek_Db_Table {
  7. protected $_name = 'test';
  8. }

Oczywiście dodam wcześniej w mojej funkcji kod starego setupTableName.
yevaud
dorzuc uruchomienie rodzica w setupTableName
  1. class Misiek_Db_table extends Zend_Db_Table {
  2. protected function _setupTableName(){
  3. parent::_setupTableName();
  4. $this->_name = TABLE_PREFIX . $this->_name;
  5. }
  6. }
  7.  
  8. class Album extends Misiek_Db_Table {
  9. protected $_name = 'test';
  10. }
misiek08
Czyli wtedy już nie muszę przpisywać kodu ze starej setupTableName? Chodzi o kod który rozbija ewentualnie nazwe bazy, i który na podstawie nazwy klasy tworzy nazwę tabeli jeśli nie została podana?
yevaud
nie musisz
misiek08
Dziękuję za tak kompleksową pomoc w sobotę. Dałem pomógł oczywiście. Można (chyba) zamknąć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.