Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa core
Fifi209
post
Post #1





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Klasa core, czyli klasa która będzie musiała zająć się ładowaniem potrzebnych klas i tworzenia ich egzemplarzy.

Wymyśliłem coś takiego:

  1. <?php
  2. class core {
  3.        
  4.        private $handle;
  5.        
  6.        public function __get($name) {
  7.            return $this->handle[$name];
  8.        }
  9.        
  10.        public function __set($name, $value) {
  11.            $this->handle[$name] = $value;
  12.            return true;
  13.        }
  14.        
  15.        public function _load($file) {
  16.            if ($this->$file) {
  17.                return $this->$file;
  18.            }else{
  19.                include_once('class/'.$file.'.php');
  20.                return $this->$file = new $file;
  21.            }
  22.        }
  23.        
  24.    }
  25. ?>


Użycie:
  1. <?php
  2. $core = new core();
  3.    $test = $core->_load('test');
  4.    $core->test->a();
  5.    $test->a();
  6. ?>


To rozwiązanie jest troszkę podpatrzone z ZF ale ręcznie trzeba ładować zamiast automatycznie. ;p (jak to zrobili w ZF ?)
Tylko klasy chciałbym podzielić np. na te do obsługi baz danych, grafiki, xml etc.
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




I jakie jest pytanie? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

W sumie, to nic innego, jak trochę uwalony wzorzec registry... Skoro robisz klasę core, to po co ją instancjujesz, w jaki sposób z kontrolerów chcesz uzyskać do niej dostęp? Tworząc nową?
Go to the top of the page
+Quote Post
antyqjon
post
Post #3





Grupa: Zarejestrowani
Postów: 77
Pomógł: 27
Dołączył: 24.03.2002
Skąd: Tarnów

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


Co do automagicznego ładowania, poczytaj o __autoload, bądź spl_autoload_register" title="Zobacz w manualu PHP" target="_manual.

Ten post edytował antyqjon 16.07.2009, 12:03:44
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(erix @ 16.07.2009, 11:56:07 ) *

Jak zrobić podział klas na te do obsługi baz etc.

Cytat(erix @ 16.07.2009, 11:56:07 ) *
W sumie, to nic innego, jak trochę uwalony wzorzec registry... Skoro robisz klasę core, to po co ją instancjujesz, w jaki sposób z kontrolerów chcesz uzyskać do niej dostęp? Tworząc nową?


Zrobię jakiś singleton ;p


Zmieniłem __get na taki:

  1. <?php
  2. public function __get($name) {
  3.            if ($this->handle[$name]) {
  4.                return $this->handle[$name];
  5.            }else{
  6.                return $this->_load($name);
  7.            }
  8.        }
  9. ?>


I teraz mam automatyczne ładowanie ;p

Cytat(antyqjon @ 16.07.2009, 12:01:20 ) *
Co do automagicznego ładowania, poczytaj o __autoload, bądź spl_autoload_register" title="Zobacz w manualu PHP" target="_manual.


Nie muszę czytać bo wiem co to jest i nie o to tutaj chodzi.

Ten post edytował fifi209 16.07.2009, 12:05:12
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Jak zrobić podział klas na te do obsługi baz etc.

A w czym problem...? Masz - powiedzmy - klasę db, która jest fabryką dla podklas...
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(erix @ 16.07.2009, 12:13:38 ) *
A w czym problem...? Masz - powiedzmy - klasę db, która jest fabryką dla podklas...


Czy np. _load() mogłoby wyglądać o tak:

  1. <?php
  2. public function _load($file) {
  3.            if ($this->$file) {
  4.                return $this->$file;
  5.            }else{
  6.                list($dir, $name) = explode('_', $file);
  7.                include_once('class/'.$dir.'/'.$name.'.php');
  8.                return $this->$file = new $file;
  9.            }
  10.        }
  11. ?>


Działa, lecz jak ładować takim czymś klasy które są potomkami ?
Czyli np. klasa która rozszerza funkcjonalność DB_MySQL nazywa sie DB_MySQL_Cos

Napisać oddzielną metodę do ładowania potomków czy tą jakoś przerobić? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Ten post edytował fifi209 16.07.2009, 12:23:53
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Hmmm... str_replace _ na / i dodać jeszcze .php czy .class.php i sprawdzić czy taki plik istnieje, jak tak to załadować go, sprawdzić czy istnieje tam deklaracja klasy (tu jej oryginalna nazwa) jeśli nie wywalić wyjątek?

Swoją drogą pomysł z tym by nazwa klasy wskazywała na jej lokalizację jest... dziwny
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Nie lubię takich rozwiązań w postaci rozwalania nazwy klas i wtedy dołączanie plików. Aż mi się coś robi, po co marnować na takie pierdoły zasoby?

Cytat
Działa, lecz jak ładować takim czymś klasy które są potomkami ?

FACTORY...
Go to the top of the page
+Quote Post
Fifi209
post
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(Crozin @ 16.07.2009, 12:41:25 ) *
Swoją drogą pomysł z tym by nazwa klasy wskazywała na jej lokalizację jest... dziwny


Cytat(erix @ 16.07.2009, 12:48:37 ) *
Nie lubię takich rozwiązań w postaci rozwalania nazwy klas i wtedy dołączanie plików. Aż mi się coś robi, po co marnować na takie pierdoły zasoby?


Hmm, a jak Wy byście to rozwiązali? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Po co marnować zasoby? Aby było wszystko ładnie i przejrzyście poukładane (nienawidzę burdelu przy projektach), wiadomo można wszystko do jednego folderu ale mając tam dziesiątki klas nie łatwo będzie się połapać mi a już nie wspomnę o kimś kto pierwszy raz ma to zobaczyć. ;p
Go to the top of the page
+Quote Post
erix
post
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Hmm, a jak Wy byście to rozwiązali?

Już trzeci raz piszę... Wzorzec FACTORY.
Go to the top of the page
+Quote Post
Fifi209
post
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(erix @ 16.07.2009, 12:53:22 ) *
Już trzeci raz piszę... Wzorzec FACTORY.


Sorki, zabieram się więc do czytania. ;p

A temat do zamknięcia.
Go to the top of the page
+Quote Post
-SaraniS-
post
Post #12





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 2.01.2005
Skąd: Opolskie

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


Cytat(fifi209 @ 16.07.2009, 10:51:15 ) *
  1. <?php
  2. class core {
  3. // (...)
  4.        public function _load($file) {
  5.            if ($this->$file) {
  6.                return $this->$file;
  7.            }else{
  8.                include_once('class/'.$file.'.php');
  9.                return $this->$file = new $file;
  10.            }
  11.        }
  12.    }
  13. ?>

Niestety - drugi raz nie zwróci Ci tego obiektu, bo dostaniesz:
Cytat(Moja klasa Core)
Notice: Undefined property: Core::$db in (...)/core.class.php on line 50

Notice: Undefined property: Core::$router in (...)/core.class.php on line 50

Notice: Undefined property: Core::$template in /(...)core.class.php on line 50

Notice: Undefined property: Core::$auth in (...)/core.class.php on line 50

Fatal error: Cannot redeclare class Auth in (...)/auth.class.php on line 4

Borykam się z tym od rana i nie skutkuje nic - ani zmiana zapisu
  1. <?php
  2. if($this->$file)
  3. ?>

na
  1. <?php
  2. if(isset($this->$file))
  3. ?>
, ani użycie tablicy zmiennych (Rejestr?) i funkcji array_key_exists() czy in_array() - odpowiednio modyfikując tablicę oczywiście, nic...
Notice na razie pomijam, isset() zdaje się na nie działa, ale i tak krzyczy o niemożności redeklaracji funkcji, z czego wniosek, że parser najpierw inkluduje kod raz jeszcze, a dopiero później sprawdziłby wynik tego if-a (gdyby nie ten fatal error) (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
Fifi209
post
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(-SaraniS- @ 16.07.2009, 16:25:35 ) *
Niestety - drugi raz nie zwróci Ci tego obiektu, bo dostaniesz:

Borykam się z tym od rana i nie skutkuje nic - ani zmiana zapisu
  1. <?php
  2. if($this->$file)
  3. ?>

na
  1. <?php
  2. if(isset($this->$file))
  3. ?>
, ani użycie tablicy zmiennych (Rejestr?) i funkcji array_key_exists() czy in_array() - odpowiednio modyfikując tablicę oczywiście, nic...
Notice na razie pomijam, isset() zdaje się na nie działa, ale i tak krzyczy o niemożności redeklaracji funkcji, z czego wniosek, że parser najpierw inkluduje kod raz jeszcze, a dopiero później sprawdziłby wynik tego if-a (gdyby nie ten fatal error) (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)


Z tym core to był przykład, mam napisany widok podobnie mogę Ci pokazać jakbyś chciał. Mam tam ładowanie modułów i działa. (oczywiście na podobnej zasadzie co tu)
Go to the top of the page
+Quote Post
erix
post
Post #14





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
isset() zdaje się na nie działa, ale i tak krzyczy o niemożności redeklaracji funkcji, z czego wniosek, że parser najpierw inkluduje kod raz jeszcze, a dopiero później sprawdziłby wynik tego if-a (gdyby nie ten fatal error)

Sprawdzasz to w klasie statycznej?
Go to the top of the page
+Quote Post
-SaraniS-
post
Post #15





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 2.01.2005
Skąd: Opolskie

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


No byłbym wdzięczny, bo kombinuję jak przysłowiowy "koń pod górkę" i nic wymyślić nie umiem...
Znalazłem sposób, żeby przed użyciem include dać
  1. <?php
  2. if(! class_exists($class)) include_once('plik/tej/klasy.php');
  3. ?>

i owszem, na fatala to pomogło, ale zdaje się, i tak tworzy mi się więcej tych obiektów...
Go to the top of the page
+Quote Post
erix
post
Post #16





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Miałem pisać o class_exists" title="Zobacz w manualu PHP" target="_manual (nota bene, jest to szybsze niż użycie samego include_once" title="Zobacz w manualu PHP" target="_manual).

Cytat
i owszem, na fatala to pomogło, ale zdaje się, i tak tworzy mi się więcej tych obiektów...

Tworzy, czy załącza?
Go to the top of the page
+Quote Post
-SaraniS-
post
Post #17





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 2.01.2005
Skąd: Opolskie

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


Załącony jest tylko raz (po tym if-ie), ale ta metoda jest wywoływana w jakiejś nieskończonej (na miarę możliwości zasobów serwera (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) pętli (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif) I wygląda to tak, jakby właśnie omijała ten warunek
  1. <?php
  2. if(isset($this->$klasa)) return true; else { // ładowanie klasy }
  3. ?>

i ładowała klasę kolejne razy...
Właśnie to teraz analizuję, skąd się to wzięło.
A ogólnie chodzi mi o to, że niektóre z bibliotek nie są wykorzystywane zawsze, a jednocześnie mogą być wymagane przez różne moduły, więc takie ładowanie na żądanie byłoby bardzo fajne - i jednocześnie pilnowanie (przez core) aby była tylko jedna ich instancja.

=== EDYTA ===
Już wiem, gdzie babola miałem - teraz działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował -SaraniS- 16.07.2009, 17:46:57
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: 16.09.2025 - 16:31