Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie metody nie statycznej z statycznej
Forum PHP.pl > Forum > PHP > Object-oriented programming
k4wo
Witaj,

mam takie banalne pytanie, jak poprawnie wywołać metodę niestatyczną ze środka metody statycznej, która jest w innej klasie? Przy tym nie chcę w tej metodzie tworzyć egzemplarza klasy.

  1. protected static $database;
  2.  
  3. public function __construct() {
  4. // chciałbym, aby ten uchwyt był dostępny dla wszystkich metod z tej klasy
  5. self::$database = new DB();
  6. }
  7.  
  8. public static function metoda( ) {
  9.  
  10. $query = self::$database->metoda_w_innej_klasie( );
  11. }


Powyższy kod, wypluwa mi następujący błąd:
Cytat
Fatal error: Call to a member function metoda_w_innej_klasie() on a non-object in


I moje pomysły się skończyły. Pomożesz? :-)
Crozin
Normalne metody (tj. niestatyczne) wywołuje się na rzecz obiektów, więc oczywistym jest, że musisz mieć jakiś obiekt.

PS. Na 99,9% właściwość database nie powinna być tutaj statyczna, a sam obiekt bazy danych (czy właściwie połączenia jak się domyślam) powinien być przekazany z zewnątrz, jako argument konstruktora.
k4wo
I ten obiekt chciałbym, żeby był dostępny dla każdej metody (bo jak utworzę egzemplarz w metodzie to działa poprawnie).

Jeżeli database będzie nie statyczną to nie dostanę się do niej przez $this. Jakiś inny pomysł? Już wiem, że to źle robię, chciałbym w tej metodzie uzyskać dostęp do metody, która łączy się z db i pobiera dane.


Jeżeli dobrze zrozumiałem @Crozin, to chodziło Ci o coś takiego?
  1. class test {
  2. protected $database;
  3.  
  4. public function __construct( $uchwyt ) {
  5. $this->database = $uchwyt;
  6. }
  7.  
  8. public static function metoda() {
  9. $this->database->signIn();
  10. }
  11.  
  12. }
  13.  
  14. $db = new databaseManager();
  15. $t = new test($db);
  16.  
  17. test::metoda();
johny_s
metoda statyczna nie ma dostępu do $this, może zastosuj singleton ?
k4wo
Udało mi się zrealizować moje zamierzenia. Tzn. mam "uchwyt" do db dostępny z każdej metody. Po prostu stworzyłem nową metodę statyczną, w której utworzyłem uchwyt do klasy z db.

  1. private static function dbHandle() {
  2. $connect_db = new databaseManager();
  3.  
  4. return $connect_db;
  5. }
Pyton_000
Jeżeli klasa databaseManager nie będzie singletonem to za chwilę zacznie się pierdyliard połączeń z bazą co zaowocuje spadkiem wydajności.

Tak jak kolega wyżej napisał zaimplementuj DBHandlera jako singleton i będziesz miał np;

  1. $db = DBHandler::getInstance()

Też będziesz miał dost. z każdej metody i klasy.
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.