Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dziedziczenie - problem
rstaciak
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 13.11.2012

Ostrzeżenie: (0%)
-----


Witam Was,

mam ostatnio dość dużą zagwozdkę odnośnie dziedziczenia mianowicie w praktycznie każdej klasie która odpowiada tabeli w bazie danych mam zdefiniowaną metodę customConditions(....) oraz getBaseSql(). getBaseSql() tworzy mi strukturę SQL wraz z ewentualnymi join'ami a customConditions(...) dołącza po prostu warunki, sortowanie, stronicowanie . Ze względu na to, że ciało customConditions(...) jest każdej klasie takie samo postanowiłem utworzyć klasę nadrzędną
  1. A
w której mam zdefiniowaną metodę customConditions(...) i klasę B w której jest zdefiniowana metoda getBaseSql() oraz dziedziczy po klasie A.





mam klasę B dziedziczącą po klasie A. W klasie A mam zdefiniowaną metodę customConditions()

KLASA NADRZĘDNA
  1. class DbTable
  2. {
  3.  
  4. public function customConditions($where=1,$orderBy=1,$page=NULL,$limitByPage=NULL)
  5. {
  6.  
  7. [b]$allOrders = self::getBaseSql();[/b]
  8. if($where==1){
  9. $data=$allOrders;
  10. }else{
  11. $data=$allOrders;
  12. foreach ($where as $key => $value) {
  13. $data=$data->where($key,$value);
  14. }
  15. }
  16. if($orderBy!=1){
  17. $data=$data->order($orderBy);
  18. }
  19. if($limitByPage!=NULL AND $page!=NULL){
  20. $data=$data->limitPage($page,$limitByPage);
  21. }
  22. return ($this->fetchAll($data)->toArray());
  23. }
  24.  
  25. }


KLASA POCHODNA

  1. class Lorem extends DbTable
  2. {
  3. protected $_tableName = 'Lorem';
  4.  
  5. public function getBaseSql()
  6. {
  7. $query=$this->select()
  8. ->setIntegrityCheck(false)
  9. ->from(
  10. array('l' => $this->_tableName),
  11. array('*')
  12. )
  13. ->join(
  14. array('i' => 'Ipsum'),
  15. 'i.ipsum.id= l.ipsum_id',
  16. array('*')
  17. );
  18. return ($query);
  19. }
  20. }
  21.  


i przy wywołaniu

  1. ...
  2. $data = $this->_loremModel->customConditions($where_array,'i.ipsum_id desc');
  3. ...


otrzymuje komunikat błędu o nie istniejącej metodzie getBaseSql() z której korzysta metoda customConditions poprzez self::getBaseSql().


Zmierzając do sedna, czy jest taka możliwość i jeśli tak to jaka by metoda klasy nadrzędnej korzystała z metody której ciało znajduje się w klasie pochodnej ?
Go to the top of the page
+Quote Post
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


self odnosi się do metody klasy, która takowy self odpala

  1. class A {
  2.  
  3. public function aa() { self:: bb(); }
  4.  
  5. public function bb() { echo __CLASS__; }
  6. }
  7.  
  8. class B extends A {
  9.  
  10. public function cc() {
  11. $this->aa(); //zwróci A
  12. }
  13. public function bb() { echo __CLASS__; }
  14. }
  15.  
  16. $class = new B();
  17. $class -> cc();


  1. $allOrders = $this->getBaseSql();


Ten post edytował CuteOne 13.11.2012, 08:42:58
Go to the top of the page
+Quote Post
rstaciak
post
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 13.11.2012

Ostrzeżenie: (0%)
-----


o kurczę $this-> zaraz sprawdzę (IMG:style_emoticons/default/smile.gif)


dzięki, wszystko działa jak powinno tyle nad tym siedziałem a zapomniałem, że $this-> tutaj będzie konieczne do użycia.

Temat uważam za zamknięty i serdecznie dziękuję, za pomoc.

Ten post edytował rstaciak 13.11.2012, 08:48:42
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 20:13