Major
11.12.2005, 18:51:16
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
11.12.2005, 19:09:58
<?
class varsRegistry
{
private $data;
{
//..
}
private function __construct()
{
//..
}
public function __set($name,$value)
{
$this->data[$name]=$value;
}
public function __get($name)
{
return $this->data[$name];
}
}
?>
To można to zrobić najprościej. Zmienne nie są ogólnie dostępne i aby dostać się
do jakieś z nich musisz napisac:
<?php
$zmienna=varsRegistry::instance()->zmienna;
?>
Major
11.12.2005, 19:30:11
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.
<?php
class vars
{
private vars;
pubic function __get ($name)
{
return $this>vars[$name];
}
public function __set ($name, $value)
{
$this->vars[$name] = $value;
}
}
# Uzywanie zmiennych w skrypcie:
$var = new vars;
$var->lol = 'tekst';
?>
NuLL
11.12.2005, 20:44:54
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 ?
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
11.12.2005, 21:12:57
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
11.12.2005, 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.
sobstel
11.12.2005, 21:29:45
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
11.12.2005, 21:30:24
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.
<?php
private vars;
private types;
public function __set ($name, $value)
{
if ($this->types[$name]==NULL)
{
$this->types[$name]=gettype ($value); $this->vars[$name] = $value;
}
elseif ($this->types[$name]==gettype ($value)) $this->vars[$name] = $value;
else
throw new Exeception ('Zmieniony typ');
}
?>
Ociu
12.12.2005, 21:07:27
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
29.12.2005, 00:25:05
możesz używać do tworzenia dynamicznego klasy eval() albo spróbować na stałych ale to jak rozumiem nie przejdzie...
Radarek
29.12.2005, 10:47:58
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.