PHP type hinting pentru tipuri primare de date, un pas mai aproape

Read this post in English

Share on:

In PHP 5 a fost introdus un nou concept, cel de type hinting. Acesta faciliate permite validarea unui parametru intr-un anumit tip.

Acest tip de validare este unul destul de popular in limbajele obiectuale si cred ca reprezinta un plus pentru modelul obiectual din PHP si mai ales pentru acest limbaj dinamic in sine.

In PHP 5.1 a fost introdusa si validare pentru tipul array.

Sa luam un mic exemplu:

 1class a { }
 2
 3class b { }
 4
 5function testa (a $a) {
 6    echo "Bla bla\n";
 7}
 8
 9testa(new a());
10
11testa(new b());

Rezultatul este:

1Bla bla
2
3Fatal error: Argument 1 passed to testa() must be an instance of a, called in ...

Tare nu?

Tipul pentru care se valideaza poate sa fie o clasa, o clasa abstracta sau chiar o interfata care este mostenita de mai multe clase, cum ar fi:

 1interface inherited { }
 2
 3class a implements inherited { }
 4
 5class b implements inherited { }
 6
 7function testa (inherited $a) {
 8    echo "Bla bla\n";
 9}
10
11testa(new a());
12
13testa(new b());

Iar exemplul de mai sus nu va da nici o eroare.

Din pacate totusi nu exista nici un mod de a valida tipuri primare (sau scalare) de date. Cand a aparut PHP 5.3 au fost niste discutii pe tema asta, dar se pare ca a fost prea tarziu iar patch-ul nu a ajuns in versiunea finala.

Ieri dimineata, in timp ce imi faceam lectura de dimineata la o cana de cafea, ce gasesc pe blog-ul lui Ilia Alshanetsky: Scalar Type Hints are Here! Bine, e putin exagerat, nu sunt tocmai aici dar sunt foarte aproape. Practic sunt in trunchiul de SVN si vor fi publice in viitoarea versiune!

Evident ca si varianta de acum de type hinting nu este tocmai o regula obigatorie a PHP, este mult mai mult o problema de finete.

Pracic se putea oricum face validarea pe un anumit de date primare pana acum, dar totusi:

1function testint($var) {
2     if(!is_int($var)) {
3         trigger_error("Type must be Integer", E_USER_ERROR);
4     }
5     .......
6}

nu este tocmai elegant, fata de:

1function testint(int $var) {
2     ......
3}