Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Extract do public variables.
Szymciosek
post
Post #1





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Witam,
wiem, że za pomocą extract($array) jestem w stanie stworzyć zmienne, a więc takie coś jak poniżej mi zadziała.

  1. <php
  2. class Test
  3. {
  4. public $array = array('first' => 'first variable');
  5.  
  6. public function __construct()
  7. {
  8. extract($this->array);
  9. echo $first; //output: first variable
  10. }
  11. }
  12. ?>


Lecz jak zrobić to tak żeby zmienne z extract weszły mi pod public $array czyli otrzymałbym coś takiego
  1. <?php
  2. class Test
  3. {
  4. public $array = array('first' => 'first variable');
  5.  
  6. //tutaj juz krok kolejny po wykonaniu extract()
  7. public $first = 'first variable';
  8.  
  9. public function __construct()
  10. {
  11. extract($this->array);
  12. echo $this->first; //to powinno działać tylko i wyłącznie po wykonaniu extract ze względu na dynamiczne tworzenie zmiennych.
  13. }
  14. }



Najlepiej chciałbym mieć możliwość stworzenia czegoś na wzór powyższego z dynamicznym tworzeniem zmiennych, ale w klasie statycznej tj:
  1. class Test
  2. {
  3. private static $array = array('first' => 'first variable'); //to byłoby pobierane z pliku, ale teraz jest array na potrzeby tego postu
  4.  
  5. public static function loadConfigFile()
  6. {
  7. //rozpoznanie srodowiska, w ktorym pracuje
  8. //ładowanie pliku z konfiguracją i tym samym tymi zmiennymi na podstawie rozpoznanego srodowiska
  9. //np. ładuje config_dev.yml
  10. self::createVariables();
  11. }
  12.  
  13. /*
  14.   * $_data => data from config file after parse
  15.   */
  16. private static function createVariables($_data)
  17. {
  18. //tutaj odbieram przekazane dane z pliku i chciałbym zrobić extract
  19. extract($_data);
  20. }
  21.  
  22. }

Teraz z innej klasy chciałbym mieć do tego dostęp tj:
  1. class Start
  2. {
  3. public function __construct()
  4. {
  5. Config::loadConfigFile();
  6. echo Config::$first;
  7. }
  8. }



Da się to jakoś zrobić?
Wiem, że się trochę rozpisałem, ale mam nadzieję, że jest to w jakimś stopniu zrozumiałe.

Pozdrawiam,
Szymon
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pyro
post
Post #2





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Tworzysz zmienną główną:

  1. class Config {
  2.  
  3. private $_data = array();
  4.  
  5. }


Następnie dodajesz __get i __set

  1. class Config {
  2.  
  3. private $_data = array();
  4.  
  5. public function __get($key) {
  6. return $this->_data[$key];
  7. }
  8.  
  9. public function __set($key, $value) {
  10. $this->_data[$key] = $value;
  11. }
  12.  
  13. }


Potem dodajesz swoje funkcje ładujące, które dodają dane do $_data, a potem się odwołujesz. Przykład:

  1. // PRZYKŁAD !
  2. $config = Config::instance();
  3. echo $config->maxAllowedUsers;
  4. echo $config->connectionTimeout;
  5. echo $config->somethingElse;
  6.  


// ADD

Cytat(Crozin @ 9.04.2013, 11:18:08 ) *
(pomijając fakt, że drugie rozwiązanie ma kilka sporych zalet, a drugie samo wady).


(IMG:style_emoticons/default/facepalmxd.gif)

Ten post edytował pyro 9.04.2013, 10:22:05
Go to the top of the page
+Quote Post

Posty w temacie


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: 17.10.2025 - 01:35