Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kontrola zmiennych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Major
Witam,

Chciałbym sie spytać czy w php5.1 jest możliwość sprawdzania poprawności używanych zmiennych.

Mam zmienne generowane dynamicznie i nie moge pozwolić by któraś z nich została nadpisana, albo jej typ został zmieniony czy też w ogole usunięta z pamięci.
NuLL
  1. <?
  2.  
  3. class varsRegistry
  4. {
  5.  
  6. private $data;
  7.  
  8. public static instance()
  9. {
  10. //..
  11. }
  12. private function __construct()
  13. {
  14. //..
  15. }
  16. public function __set($name,$value)
  17. {
  18. $this->data[$name]=$value;
  19. }
  20. public function __get($name)
  21. {
  22. return $this->data[$name];
  23. }
  24. }
  25. ?>

To można to zrobić najprościej. Zmienne nie są ogólnie dostępne i aby dostać się
 do jakieś z nich musisz napisac:
  1. <?php
  2.  
  3. $zmienna=varsRegistry::instance()->zmienna;
  4. ?>
Major
Myślałem o podobnym rozwiązaniu wcześniej ale niestety odpada bo wtedy cały system straci swoją prostote, myślałem że coś sie znajdzie w SPL ale niestety nie znalazłem tam niczego takiego.
dtb
  1. <?php
  2. class vars
  3. {
  4. private vars;
  5. pubic function __get ($name)
  6. {
  7. return $this>vars[$name];
  8. }
  9. public function __set ($name, $value)
  10. {
  11. $this->vars[$name] = $value;
  12. }
  13. }
  14.  
  15. # Uzywanie zmiennych w skrypcie:
  16.  
  17. $var = new vars;
  18.  
  19. $var->lol = 'tekst';
  20. echo $var->lol;
  21. ?>
NuLL
Przepraszam - ROTFL

Jak ty chcesz z tego korzystac w obrebie skryptu i czym to sie sie rozni od mojego rozwiazania pozatym jest mocno kulawe ? Za kazdym razem chcesz tworzyc nowa instancje tej klasy ?
dtb
czytalem ze tworzac instancje klasy skrypt dziala szybciej (nie potrafie w tej chwili dac linku)
EDIT: i po co komu konstruktor i instance()?
EDIT2:
Cytat(webcity.pl)
Jako ciekawostkę dodam, iż używanie elementów statycznych jest odrobinę wolniejsze od tworzenia i korzystania z normalnych obiektów
dr_bonzo
To nie temat o szybkosci OOP
NuLL tworzy jeden obiekt (wzorzec Singleton), a dtb wiele. I co jest szybsze?

Ja nadal nie rozumiem o co chodzi
Cytat
sprawdzania poprawności używanych zmiennych.

Mam zmienne generowane dynamicznie i nie moge pozwolić by któraś z nich została nadpisana, albo jej typ został zmieniony czy też w ogole usunięta z pamięci.
Major
Chodzi o to że mam zmienne/tablice
$nazwaZmiennej
I ona nie może zmienić typu string / array / int a nie może przybrać wartościu null czy być unsetowana. Jeżeli typ zostanie zmieniony to najlepiej by był wygenerowany wyjątek.
sobstel
Cytat(Major @ 2005-12-11 21:19:02)
Chodzi o to że mam zmienne/tablice
$nazwaZmiennej
I ona nie może zmienić typu string / array / int a nie może przybrać wartościu null czy być unsetowana. Jeżeli typ zostanie zmieniony to najlepiej by był wygenerowany wyjątek.

imho najlepszym rozwiazaniem byloby to co napisal NULL + sprawdzanie typu
Ociu
Moim zdaniem nie można czegoś takiego zrobić. Nie można sprawić, aby nie pożna było wykasować elementu z tablicy czy sprawić aby zmienna nie mogła przyjąć innej wartości etc.
dtb
  1. <?php
  2. private vars;
  3. private types;
  4.  
  5. public function __set ($name, $value)
  6. {
  7. if ($this->types[$name]==NULL)
  8. {
  9. $this->types[$name]=gettype ($value);
  10. $this->vars[$name] = $value;
  11. }
  12. elseif ($this->types[$name]==gettype ($value))
  13. $this->vars[$name] = $value;
  14. else
  15. throw new Exeception ('Zmieniony typ');
  16. }
  17. ?>
Ociu
vars i types powinno być array();

A poza konkursem.

Co jeśli zmienie typ przed 'wywołaniem funkcji' __set ? kicha.

Tak samo jak zrobisz obserwowanie unset() ?
konradk2
możesz używać do tworzenia dynamicznego klasy eval() albo spróbować na stałych ale to jak rozumiem nie przejdzie...
Radarek
php wymaga od programistow samodyscypliny. Jesli jej nie bedziesz mial to nic ci nie pomoze :-). Przy dosc dobrze zaprojektowanym systemie (oop) jest to duzo latwiejsze niz przy wczesniejszych rozwiazaniach (np masa globalnych zmiennych, do ktorych mialo sie dostep w kazdym miejscu skryptu). Co tu duzo mowic: pilnowac, pilnowac i jeszcze raz pilnowac (sie).
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.