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
Crozin
post
Post #2





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

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


Cytat
Co do dependency injection mam zamiar się wziąć powoli i tak ogólnie za wzorce projektowe, aczkolwiek nie wiem kiedy znajdę chwilę na to, bo matura niedługo.
Dependency Injection i inne podstawy OOP w 45 sekund:
1. Obiekt w miarę możliwości nie powinien odwoływać się do niczego co pochodzi spoza jego samego, tj. żadnych zmiennych globalnych czy odwołania do innych klas (patrz: Config::getInstance() czy zapisanie nazw plików wewnątrz klasy).
2. Biorąc sobie do serca punkt pierwszy, musimy dojść do wniosku, że wszelkie zależności muszą być przekazane przez argumenty metod.
2.1. Jeżeli jakaś zależność jest niezbędna do działania obiektu, powinna być przekazana już w konstruktorze.
2.2. Jeżeli jakaś zależność jest opcjonalna można dla niej utworzyć osobnego settera.
3. Każdy obiekt zajmuje się jedną rzeczą (czyli taki obiekt Config nie bawi się już w rozpoznawanie czy pracuje w środowisku produkcyjnym czy deweloperskim).
4. Gdzie się tylko da unikamy static (tutaj nie ma żadnej przesłanki sugerującej konieczność skorzystania z tego).
5. Dbamy o obsługę błędów (metoda get() powinna rzucić wyjątek InvalidArgumentException w przypadku odwołania się do nieistniejącego klucza).

Oczywiście nie są to jakieś nienaruszalne zasady, ale jeżeli je łamiesz musisz to robić świadomie i umieć sobie odpowiedzieć dlaczego warto je łamać.
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: 13.10.2025 - 06:45