Login lub e-mail Hasło   

Sprawdzanie typów w PHP5

Odnośnik do oryginalnej publikacji: http://urzenia.net/254/sprawdzanie-typow-w-php5
Jak zaimplementować proste sprawdzanie typów w PHP5? Teoretycznie proste sprawdzanie typów w funkcjach, przy liście argumentów, już jest - ale nie dotyczy t...
Wyświetlenia: 1.675 Zamieszczono 14/06/2006

Jak zaimplementować proste sprawdzanie typów w PHP5?

Teoretycznie proste sprawdzanie typów w funkcjach, przy liście argumentów, już jest - ale nie dotyczy to typów wbudowanych a obiektów. Czasem jednak jest potrzebny sposób na automatyczne sprawdzenie rodzaju zamiennej - i to postaram się niżej omówić.

Nie da się kontroli typów zrobić jak w C++, gdzie jest ona bardziej ścisła, ale myślę że w wielu wypadkach starczy. Jest to o tyle wygodne, że łatwiej nieco będzie wykrywać nieścisłości (zresztą, po to jest sprawdzanie typów).

Przykład kodu:

class Test
{
protected $properties = array(
'var1' => array('tralala', 'string'),
'var2' => array(3, 'integer'),
'var3' => array(array('tralala', 'bulcykcyk), 'array')
);
public function __set($key, $value)
{
if (!array_key_exists($key, $this->properties)) {
throw new Exception(sprintf('"%s" property doesn't exists.', $key));
}
if (gettype($value) != $this->properties[$key][1]) {
throw new Exception(sprintf('"%s" property must be an "%s" type, is "%s".',
$key,
$this->properties[$key][1],
gettype($value)
));
}
$this->properties[$key][0] = $value;
}
}

Najtrudniejszym elementem jest tutaj każdorazowe ustawianie właściwej konstrukcji zmiennej $properties, ponieważ ta tablica ma konkretny format:

$properties = array(
'nazwa_zmiennej' => array('wartość', 'typ')
)

Jako "wartość" wstawiamy tam wartość właściwości (obojętnie, czy obiekt, int, string, tablicę czy coś innego), a jako "typ" - wartość zwracana przez funkcję getttype() wywołaną na przechowywanym obiekcie. Dla napisów będzie to wartość "string", dla liczb całkowitych: "integer", a dla obiektów: "object".

Ta kontrola typów jest o tyle uproszczona, że nie sprawdza, czy przechowywany obiekt jest instancją danej klasy (tej która ma być przechowywana), oraz czy tablica przechowuje żądany typ obiektów. O ile pierwsze czasem warto, i łatwo zrobić za pomocą is_a() czy też get_class(), o tyle drugie może być trudniejsze i wymagać funkcji dodatkowych (jeśli sprawdzanie ma być niezależne od ilości zagłębień tablicy).

Przykład użycia:

$a = new Test;
try {
$a->var1 = 'asd'; //ok
$a->var2 = 1; //ok
$a->var3 = array(1, 2, 3); //ok

//$a->var1 = 1; //exception!
//$a->var2 = 'a'; //exception!
//$a->var3 = 1; //exception!
} catch (Exception $e) {
echo $e->getMessage();
}

W moim wypadku najlepszym rozwiązaniem było utworzenie klasy "Test" jako abstrakcyjnej ("abstract") i tworzenie kolejnych klas jako dziedziczących z niej. Każde z dzieci musi oczywiście mieć swoją wersję tablicy "$properties".

Podobne artykuły


16
komentarze: 5 | wyświetlenia: 8948
9
komentarze: 0 | wyświetlenia: 2735
49
komentarze: 18 | wyświetlenia: 64716
37
komentarze: 9 | wyświetlenia: 28292
6
komentarze: 3 | wyświetlenia: 18442
17
komentarze: 4 | wyświetlenia: 13429
15
komentarze: 5 | wyświetlenia: 32566
13
komentarze: 2 | wyświetlenia: 22860
12
komentarze: 3 | wyświetlenia: 29637
11
komentarze: 1 | wyświetlenia: 10293
11
komentarze: 2 | wyświetlenia: 18441
11
komentarze: 1 | wyświetlenia: 86110
11
komentarze: 2 | wyświetlenia: 32998
10
komentarze: 2 | wyświetlenia: 8053
 
Autor
Artykuł

Powiązane tematy





Ten kod przydało by się lepiej sformatować...

Rzeczywiście, słabo czytelny...

Dla autora: polecam usunąć formatowanie i nadać styl Kod na nowo.

To miałem na myśli ;)...

Jest wrzucony w <pre> i <code> bo tak miałem na blogu - powiedzcie dokładniej co zrobić, to poprawie :)

W sumie system powinien to dobrze zainterpretować, napisałem o tym do autorów, za 30 minut już wszystko było ok. Oni to pracują!


Aha, chodziło o to żebyś użył stylu Kod (nie znacznika <code>). W filmiku instruktażowym tam gdzieś jest o tych stylach, zresztą masz to w edytorze jak byk...

Nie używam (jeśli o to chodzi) edytora wizualnego - nie cierpię takich pseudoułatwiaczy. Jest u mnie w ogóle wyłączony. Ale później go włączę żeby zobaczyć o co dokładniej chodzi, sprawdzę jakie tam są opcje, i wyłączę z powrtoem ;) Dzięki za zwrócenie uwagi :) A co do pracy autorów - fakt, szybcy są :) Poprawki, jak i nowe rzeczy zazwyczaj tego samego dnia sie pojawiają :)



Dodaj swoją opinię
W trosce o jakość komentarzy wymagamy od użytkowników, aby zalogowali się przed dodaniem komentarza. Jeżeli nie posiadasz jeszcze swojego konta, zarejestruj się. To tylko chwila, a uzyskasz dostęp do dodatkowych możliwości!
 

© 2005-2018 grupa EIOBA. Wrocław, Polska