Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Globalna tablica wewnątrz klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
BORG
Na początek kod:
  1. lang("items");
  2. echo $Lg['Sword'];
  3. class Item
  4. {
  5. //global $Lg;
  6. public $name, $desc, $type;
  7. public function __construct($name, $desc = null)
  8. {
  9. $this->name = $Lg[$name];
  10. echo $Lg['Sword'];
  11. }
  12. }


Funkcja lang includuje mi plik items.php w którym mam tablice $Lg. Dla testu czy wyświetlam zawartość $Lg['Sword'] - działa. Dalej wewnątr klasy chcę w konstruktorze przypisać przedmiotowi odpowiednią nazwę, niestety nie ma żadnych efektów. Dla testów próbuję wyświetlić $Lg['Sword'] i nic nie pokazuje. Kiedy dodaję global $Lg; pojawia się błąd:
Parse error: syntax error, unexpected T_GLOBAL, expecting T_FUNCTION in /includes/class.php on line 5

Dopiero zaczynam bawić się klasami i nie mam pojęcia jak to zrobić, może mi ktoś wytłumaczyć jak to zrobić?
abort
Nie tak smile.gif
Najpierw definiujesz zmienne, wewnatrz klasy dajesz:
  1. class Item
  2. {
  3. // Definiujemy zmienne publiczne - ale WEWNĄTRZ KLASY, czyli dostępne dla wszystkich metod klasy
  4. public $name, $desc, $type;
  5. public Lg = array();

Zdefiniowaliśmy także zmienną $Lg, jawnie jako tablicę. I teraz jeśli chcesz wpisać do niej dane już z konstruktora, to:
  1. public function __construct($name, $desc = null)
  2. {
  3. $this->Lg = $name;
  4. // i dalsze rzeczy, które robi konstruktor
  5. }


Zauważ, że w konstruktorze $name to jest ciągle odwołanie do parametru konstruktora, a $this->name do własności obiektu. Te rzeczy niekoniecznie muszą być równe, chyba że stosujesz taką mnemotechnikę nazewnictwa zmiennych przekzywanych w metodach obiektu, która w definicji metody stosuje takie nazwy zmiennych, jak nazwy własności obiektu.
BORG
Dzięki za odpowiedź, ale stosując twoje rozwiązanie tworzę nową publiczną tablicę wewnątrz klasy, której przypisuję wartość z konstruktora. A ja chcę przypisać zmiennej $name wartość z wcześniej zadeklarowanej tablicy $Lg, którą mam w osobnym pliku, dzięki czemu kiedy będę chciał w przyszłości przetłumaczyć nazwy na inny język to wszystko mam w jednym miejscu.

Edit: w zasadzie to mogę tworząc obiekt w konstruktorze po prostu dać swoje $Lg i po kłopocie ale jak już zacząłem temat to może i tak ktoś mi wyjaśni czemu
Kod
global $Lg;
mi nie działa?
abort
Bo to jest sprzeczne z ideą obiektowości.
Obiekt to jest takie coś, które ma:
- SWOJE WŁASNE cechy (czyli zmienne wewnątrz obiektu)
- SWOJE WŁASNE metody komunikacji się ze światem (czyli funkcje wewnątrz obiektu)
Twoje global w tym kontekście brzmi jak parapsychologia, serio smile.gif
Tak się nie robi, PHP tego zabrania, koniec dyskusji smile.gif

Nie będę się rozpisywał, ale więcej informacji masz tu: http://stackoverflow.com/questions/5563758...string-in-class
CuteOne
  1. class AA {
  2.  
  3. protected $_miecz;
  4. protected $_lang;
  5.  
  6. public function __construct($lang) {
  7.  
  8. if(!is_array($lang) || empty($lang)) {
  9.  
  10. // wywal wyjatek
  11. }
  12. $this->_lang = $lang;
  13. }
  14.  
  15. public function XXX() {
  16. if(!isset($this->_lang['sword'])) { // zamiast tego powinna być osobna metoda
  17. // wywal wyjatek
  18. }
  19. $this->_setMiecz($this->_lang['sword']);
  20. }
  21.  
  22. protected function _setMiecz($str=null) {
  23.  
  24. if($str === null) {
  25.  
  26. //wyjatek
  27. }
  28. $this->_miecz= $str;
  29. }
  30. }
  31.  
  32. $lang = array('sword' => 'miecz', 'maczuga'=>'aaaa');
  33.  
  34. $class = new AA($lang);
  35. $class -> XXX();
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.