Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Publiczna zmienna w funkcji
MMySlime
post 19.05.2013, 21:48:00
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


Witam,
pracuję nad stworzeniem klasy struktur (znanej bardzo dobrze z C++), niestety mam problem. Próbuję zrobić funkcję, która tworzy dla klasy publiczną zmienną. Dla przykładu, mamy zmienną $foo i chcemy do niej przypisać strukturę, więc przypisujemy do $foo funkcję assign ($foo = Struct::assign(Nazwa struktury)) i możemy korzystać ze struktury jako $foo->zmienne. Może mój błędny kod:

  1. static function assign($name){
  2.  
  3. $handler = new Struct;
  4.  
  5. $handler->rawSet(self::$bank[$$name]);
  6.  
  7. return $handler;
  8.  
  9. }
  10.  
  11. private function rawSet(array $vars){
  12.  
  13. foreach($vars as $key){
  14.  
  15. public $$key;
  16.  
  17. }
  18.  
  19. }


Kod błędu jest następujący:
Parse error: syntax error, unexpected 'public' (T_PUBLIC) in D:\User\Projekty\PHP\core\lib\struct.php on line 39

Dziękuję za pomoc! smile.gif
Go to the top of the page
+Quote Post
wookieb
post 20.05.2013, 07:41:56
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. $this->{$key} = null;


--------------------
Go to the top of the page
+Quote Post
Sephirus
post 20.05.2013, 07:44:01
Post #3





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Na pierwszy rzut oka widać co robisz źle - nie możesz deklarować własności klasy wewnątrz jej metody.

Jeśli chcesz uzyskać taki efekt to jedyne co mi przychodzi do głowy to użycie tablicy oraz własności __set oraz __get:

  1. private $_variables = array();
  2.  
  3. static function assign($name){
  4.  
  5. $handler = new Struct;
  6.  
  7. $handler->rawSet(self::$bank[$$name]);
  8.  
  9. return $handler;
  10.  
  11. }
  12.  
  13. private function rawSet(array $vars){
  14. $this->_variables = $vars;
  15. }
  16.  
  17. public function __get($key) {
  18. return isset($this->_variables[$key]) ? $this->_variables[$key] : null;
  19. }
  20.  
  21. public function __set($key,$value) {
  22. $this->_variables[$key] = $value;
  23. }


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
MMySlime
post 20.05.2013, 17:14:37
Post #4





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


Dzięki wielkie! Właśnie tego mi było trzeba wink.gif
Oczywiście by nie być "żyła", daję pomógł smile.gif
Go to the top of the page
+Quote Post
zegarek84
post 20.05.2013, 20:47:53
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


teraz jestem z deczka "dziabnięty ;p" i nie chce mi się sprawdzać (już jakiś czas nie kodziłem w php), ale o ile pamięć mnie nie myli oba rozwiązania są poprawne, tzn. chciałbym tu zwrócić uwagę na podane rozwiązanie przez @wookieb... domyślnie jak pamiętam takie zmienne są publiczne, więc to co tu próbujecie osiągnąć, oprócz tego powinno to być szybsze... ktoś powie, że minusem tu może być wyzerowanie istniejącej zmiennej publicznej, z kolei drugie rozwiązanie jest z deczka wolniejsze i w tablicy przechowywane są zmienne nie zadeklarowane publicznie w danej klasie (choć to też można potraktować na +)...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

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: 28.03.2024 - 14:49