Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Wywoływanie klasy w klasie
sannin
post
Post #1





Grupa: Zarejestrowani
Postów: 308
Pomógł: 13
Dołączył: 31.10.2008

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


Witam,

dopiero zaczynam swoją zabawę z obiektowym php. Teraz mam pytanie do bardziej zaawansowanych koderów czy moje rozwiązanie jest dobre. Więc tak mam folder gdzie tworzę pliki z klasami dajmy 'Mysql.class.php'. W pliku library.php ładuje wszystkie klasy

  1. <?php
  2. require('Mysql.class.php');
  3.     require('Main.class.php');
  4. ?>


w pliku system.php ładuje library.php i config.php Natomiast w pliku index.php mam

  1. <?php
  2. require('config/system.php');
  3.    
  4.     $mysql = new MySql;
  5.     $mysql->Connect($CONFIG['dbHost'], $CONFIG['dbUser'], $CONFIG['dbPassword'], $CONFIG['dbName']);
  6.    
  7. ...
  8.  
  9.     $index = new Main();
  10.     $index->prace());
  11. ?>


Teraz żeby uzyskać dostęp do mysql w klasie Main, metodzie prace mam coś takiego

  1. <?php
  2. function prace()  {    
  3.             global $mysql;
  4.            
  5.             $job = $mysql->selectToArray("tabela", "id, name", "id > 3", "");
  6.             foreach($job['name'] as $value) {
  7.                 echo $value.'
  8.     ';
  9.             }
  10.         }
  11. ?>


Czy ogólnie jest to poprawne podejście? Czy raczej wystrzegać się global? Jak to inaczej rozwiązać? Proszę mi nie proponować Zend'a itd. bo najpier chciałbym liznąć troszkę obiektówki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam i z góry dziękuje za pomoc.
Powód edycji: Proszę używać tagu [PHP] do umieszczania kodu PHP. Dodane także tagi do tematu.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
l0ud
post
Post #2





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


Cytat
Się wystrzegać. Do tego zadania doskonale sprawdzi się singleton.

...który tylko 'ładniej' wygląda. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Utwórz klasę łączącą wszystkie (zawierającą w sobie tablicę wszystkich obiektów) i przekazuj jej instancję do wszystkich nowo utworzonych obiektów. Musi zawierać metody, dzięki którym pozwoli na dostęp do obiektów z zewnątrz, oraz najlepiej od razu je wczytywać.

Jakiś uproszczony przykład:

index.php
  1. <?php
  2. include ('includes/core.php');
  3.  
  4. $core = new core;
  5.  
  6. $core->initComponents(); //tutaj można dodać obsługę ew. wyjątków
  7. ?>


core.php

core.php
  1. <?php
  2. class core {
  3.   private $obj = array();
  4.  
  5.   public function __get($objName) {
  6.      if (isset($this->obj[$objName])) return $this->obj[$objName];
  7.   }
  8.  
  9.   public function load($className) {
  10.      include('includes/'.$className.'.php');
  11.      $this->obj[$className] = new $obj($this);
  12.   }
  13.  
  14.  public function initComponents() {
  15.     $this->load('mysql');
  16.      $this->load('config'); //itd
  17.  }
  18.  
  19. }
  20. ?>


przykładowe config.php
  1. <?php
  2. class config {
  3.   private $db;
  4.   //inne obiekty, których tutaj potrzebujemy
  5.   public function __construct(core $core) {
  6.      //wczytywanie tych obiektów do klasy
  7.      $this->db = $core->db;
  8.      //itd.
  9.   }
  10.   public function action() { //i jakaś tam akcja tej klasy
  11.      $this->db->query('zapytanie');
  12.   }
  13. }
  14. ?>


Później jeszcze możesz dodać metodę startAction() do core, które wczyta właściwy plik, który będzie coś robił (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Plik zostanie wczytany wewnątrz klasy core, a więc do obiektów będziesz się odnosił tam przez $this.
Go to the top of the page
+Quote Post
adek140
post
Post #3





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

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


Cytat(l0ud @ 20.11.2008, 20:59:13 ) *
core.php
  1. <?php
  2. class core {
  3.   private $obj = array();
  4.  
  5.   public function __get($objName) {
  6.      if (isset($this->obj[$objName])) return $this->obj[$objName];
  7.   }
  8.  
  9.   public function load($className) {
  10.      include('includes/'.$className.'.php');
  11.      $this->obj[$className] = new $obj($this);
  12.   }
  13.  
  14.  public function initComponents() {
  15.     $this->load('mysql');
  16.      $this->load('config'); //itd
  17.  }
  18.  
  19. }
  20. ?>


12 linijka w pliku powyżej powoduje błąd (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Fatal error: Class name must be a valid object or a string in H:\Serwer\tescik\includes\core.php on line 11

jakaś wskazówka?
tutaj pliczki http://wyslijto.pl/plik/u0rcn5sg8s
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(adek140 @ 31.07.2009, 15:49:11 ) *
12 linijka w pliku powyżej powoduje błąd (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Fatal error: Class name must be a valid object or a string in H:\Serwer\tescik\includes\core.php on line 11

jakaś wskazówka?
tutaj pliczki http://wyslijto.pl/plik/u0rcn5sg8s


Jeżeli Ci to pomoże, mam coś podobnego w swoim prototypowym widoku:

  1. <?php
  2. public function __get($name) {
  3.            if ($this->modules[$name]) {
  4.                return $this->modules[$name];
  5.            }else{
  6.                return false;
  7.            }
  8.        }
  9.  
  10.        public function _load($name) {
  11.            if ($this->$name) {
  12.                return $this->$name;
  13.            }else{
  14.                $temp = __CLASS__ .'_'. $name;
  15.                if (file_exists('modules/'.$temp.'.php')) {
  16.                    include_once('modules/'.$temp.'.php');
  17.                    return $this->$name = new $temp;
  18.                }else{
  19.                    return false;
  20.                }
  21.            }
  22.        }
  23. ?>


Oczywiście to wycięty fragment.
Uznałem, że podzielenie widoku na moduły odpowiadające np. za szablony, bbcode, formularze będzie dobrym rozwiązaniem. (mam wszystko ładnie posegregowane i wiem co do czego jest)

Sam plik z tą klasą nazywa się view.php
A moduły przykładowo: view_template.php (który zawiera klasę o takiej samej nazwie)

Działa i powiem, że dość fajne rozwiązanie na które po części naprowadził mnie Erix (mój pro (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) ) . (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie
- sannin   [PHP]Wywoływanie klasy w klasie   20.11.2008, 19:22:42
- - erix   CytatCzy ogólnie jest to poprawne podejście? Czy r...   20.11.2008, 19:32:37
- - l0ud   CytatSię wystrzegać. Do tego zadania doskonale spr...   20.11.2008, 19:59:13
|- - adek140   Cytat(l0ud @ 20.11.2008, 20:59:13 ) c...   31.07.2009, 15:49:11
|- - fifi209   Cytat(adek140 @ 31.07.2009, 15:49:11 ...   31.07.2009, 22:26:04
- - erix   Uzasadnij, w jaki sposób Twoje rozwiązanie jest le...   20.11.2008, 20:06:45
- - sannin   Już mniej lub więcej rozumiem o co chodzi ;p Teraz...   20.11.2008, 20:16:57
- - Mize   Takie, że przykładowo w Widoku nie masz dostępu do...   20.11.2008, 20:28:15
- - erix   Jakoś nigdy nie miałem tego typu problemów z singl...   20.11.2008, 20:42:25
- - l0ud   CytatUzasadnij, w jaki sposób Twoje rozwiązanie je...   20.11.2008, 21:24:40
- - sannin   Trochę poczytałem, nie wiem czy zrozumiałem ;d ale...   20.11.2008, 21:27:06
- - erix   CytatTak jak chociażby Mize powiedział, nie mogę n...   20.11.2008, 21:32:11
- - sannin   Czy jest ktoś w stanie mi pomóc zamiast się wykłóc...   20.11.2008, 22:07:39
- - erix   CytatW klasach muszę natomiast robić tak A zwykła ...   20.11.2008, 22:51:57
- - sannin   Działa, tylko że wtedy muszę od now...   20.11.2008, 22:57:59
- - erix   Później $mysql->metoda. Z dwukropkiem wywo...   21.11.2008, 16:19:09
- - sannin   Poczytałem i wydaje mi się, że już to łapie... Dos...   21.11.2008, 19:51:48
- - erix   Cytattylko autor pisze tutaj, że singleton nie jes...   21.11.2008, 22:13:10
- - l0ud   CytatOdchodząc od tematu mam jeszcze pytanie co do...   21.11.2008, 22:40:45
- - sannin   Cytat(l0ud @ 21.11.2008, 22:40:45 ) T...   21.11.2008, 23:56:32
- - erix   To już jak Tobie wygodniej. Choć dobrym sposobem...   22.11.2008, 10:38:37
- - TrevorGryffits   No tak. A gdzie deklarujesz zmienną $obj?   31.07.2009, 20:32:30
- - adek140   niestety wciąż nie potrafie sobie poradzić prze...   18.08.2009, 16:37:31


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: 15.10.2025 - 20:39