Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wywołanie metody nie statycznej z statycznej
k4wo
post 2.06.2014, 14:54:03
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 11.01.2013

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


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? :-)
Go to the top of the page
+Quote Post
Crozin
post 2.06.2014, 14:59:07
Post #2





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

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


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.

Ten post edytował Crozin 2.06.2014, 14:59:33
Go to the top of the page
+Quote Post
k4wo
post 2.06.2014, 15:16:13
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 11.01.2013

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


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();
Go to the top of the page
+Quote Post
johny_s
post 2.06.2014, 15:24:03
Post #4





Grupa: Zarejestrowani
Postów: 594
Pomógł: 122
Dołączył: 17.07.2005
Skąd: P-na

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


metoda statyczna nie ma dostępu do $this, może zastosuj singleton ?
Go to the top of the page
+Quote Post
k4wo
post 2.06.2014, 15:37:57
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 11.01.2013

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


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. }
Go to the top of the page
+Quote Post
Pyton_000
post 2.06.2014, 16:21:32
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 14:18