![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Zmienne typu static powinny po pierwszym prezyjęciu wartości cały czas potem mieć tą samą wartość. Działa to dobrze z np singleton'ami ale czemu w tm przykładzie nie działa ?
Dodam ze w manulau nie ma o static wiec trudniej znalezc blad i mojha wiedza jest bardziej z przykładów. [php:1:0ac8a54207]<?php class DB { var $sql; function DB($server = null, $user = null, $password = null, $database = null) { var_dump($server, $user, $password, $database); // zmienne maja wartosc podana static $server, $user, $password, $database; var_dump($server, $user, $password, $database); // zmienne przymuja wartosc null $this->sql = mysql_connect($server,$user,$password) or die("Nie można sie polaczyc !!"); mysql_select_db($database) or die("Baza mysql nieistnieje !!"); return true; } function &getDBInstance() { static $DBinstance = null; if (!isset($DBinstance)) { $DBinstance = new DB(); } return $DBinstance; ?>[/php:1:0ac8a54207] } [php:1:0ac8a54207]<?php class test{ var ......; function test(){ $this -> db = &new DB($server, $user, $password, $database); var_dump($this); $this -> db = &DB::getDBInstance(); var_dump($this); } ?>[/php:1:0ac8a54207] |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
jeżeli to ma być php5 to poczytaj najpierw http://www.php.net/zend-engine-2.php , jeżeli php4 to zmienne statyczne działają tylko w zwykłych funkcjach (poza klasą)
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat jeżeli php4 to zmienne statyczne działają tylko w zwykłych funkcjach (poza klasą)
tego mi brakowało. wielkie dzieki. Update : Hm ale dziwne jest to że przy singletonie dział poprawnie pomimo że jest w klasie. [php:1:75d476f7be]<?php class test{ var $error; function test() { $this -> error = &test::getInstance('error'); $this -> error -> test = "set"; var_dump($this->error); $this -> error = &test::getInstance('error'); var_dump($this->error); $this -> error = &test::getInstance('error'); var_dump($this->error); } function &getInstance($class) { static $instance = array(); if (!isset($instance[$class])) { $instance[$class] = new $class(); } return $instance[$class]; } } class error{ function error(){ return true; } } ?>[/php:1:75d476f7be] Kod object(error)
'test' => 'set' object(error) 'test' => 'set' object(error) 'test' => 'set' |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Cytat Hm ale dziwne jest to że przy singletonie dział poprawnie pomimo że jest w klasie.
Być może, że działa. Nie interesowałem się singletonami w PHP4, więc mogłem się mylić. Może po prostu static nie działa w konstruktorze (DB)? |
|
|
![]()
Post
#5
|
|
![]() Administrator planeta/IRC Grupa: Przyjaciele php.pl Postów: 385 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Zabrze Ostrzeżenie: (0%) ![]() ![]() |
Cytat zmienne statyczne działają tylko w zwykłych funkcjach (poza klasą)
W metodach klasy też działają (inaczej singleton trzebaby opierać na przechowywaniu referencji do obiektu w $GLOBALS), ale gorzej może być z działaniem w kontruktorze, który jest trochu bardziej specyficzną metodą, wiadomo że nie wywołuje się jej wielokrotnie ale raz podczas tworzenia instancji. Dlatego lepiej jest (tak jak w przykładzie nr. 2) powsadzać te dane w zmienne klasowe, a nie bawić się w statici ![]() -------------------- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Tez tak sprawdzałem. robiłem kolejny przykłąd.
Z tym static chodzi żeby podawać raz tylko parametry połączenia. Niesttey nadal jest lpia.Nie jest w konstruktorze, a nadal wartości są zmieniane w linijce static $DBinstance = null, $server, $user, $password, $database; [php:1:f34a861b55]<?php class DB { var $sql; function DB($server, $user, $password, $database){ $db = &DB::get_DB(); return $db; } function &get_DB($server = null, $user = null, $password = null, $database = null) { // wartosci poprawne static $DBinstance = null, $server, $user, $password, $database; // wartosci = null if (!isset($DBinstance)) { $DBinstance = DB::connect($server, $user, $password, $database); } return $DBinstance; } function Connect($server, $user, $password, $database){ $this->sql = mysql_connect($server,$user,$password); mysql_select_db($database); return true; } ?>[/php:1:f34a861b55] Update Posprawdzałem, posprawdzałem i mam.. Zmienne static i paramerty miały takie same nazwy wiec sie nadpisywały. Głupi błąd. Dzięki za zainteresowanie. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 17:00 |