Ça parait assez confus ton truc
Quant au typage en PHP5, cela ne fonctionne que pour les classes. Imaginons qu'on ait écrit une classe Voiture, et une fonction clonerVoitures qui renvoie un tableau de X clones de la voiture :
Quant au typage en PHP5, cela ne fonctionne que pour les classes. Imaginons qu'on ait écrit une classe Voiture, et une fonction clonerVoitures qui renvoie un tableau de X clones de la voiture :
Code PHP :
<?php
function clonerVoitures( Voiture $voiture , int $nbClones )
// ERREUR ! On ne peut pas typer un entier
clonerVoiture( Voiture $voiture , $nbClones )
// OK
Idem pour les attributs dans une classe. Comme c'est très limité, je préfère ne pas utiliser du tout cette fonctionnalité, et plutôt vérifier le type à la volée au début des fonctions. Pour ce faire je m'étais fait une classe de typage. Les noms des méthodes parlent d'eux-même, chaque fonction check* vérifie le type du paramètre à tester, et lève une exception en cas d'erreur.
Je vous la donne ça peut toujours servir :
Code PHP :
<?php
class TypeException extends Exception
{
}
class Typage
{
function raiseException($expectedType, $foundType = null)
{
$message = "Type error : $expectedType expected";
if ($foundType) {
$message .= ", but $foundType found";
}
throw new TypeException($message);
}
function check($type, $var, $nullAllowed = false)
{
if ($nullAllowed && $var === null) {
return true;
}
$type = strtolower($type);
if (substr($type,0,5) == 'class') {
Typage::checkObject($object, $nullAllowed);
if ( ! ($object instanceof $className) ) {
Typage::raiseException("Class:$class", "Class:".get_class($obj));
}
}
else {
$function = "is_$type";
if (function_exists($function)) {
if (!$function($var)) {
Typage::raiseException($type, gettype($var));
}
}
}
return true;
}
function checkInt($var, $nullAllowed = false)
{
return Typage::check('int', $var, $nullAllowed);
}
function checkFloat($var, $nullAllowed = false)
{
return Typage::check('float', $var, $nullAllowed);
}
function checkNumeric($var, $nullAllowed = false)
{
return Typage::check('numeric', $var, $nullAllowed);
}
function checkString($var, $nullAllowed = false)
{
return Typage::check('string', $var, $nullAllowed);
}
function checkBool($var, $nullAllowed = false)
{
return Typage::check('bool', $var, $nullAllowed);
}
function checkResource($var, $nullAllowed = false)
{
return Typage::check('resource', $var, $nullAllowed);
}
function checkCallable($var, $nullAllowed = false)
{
return Typage::check('callable', $var, $nullAllowed);
}
function checkObject($var, $nullAllowed = false)
{
return Typage::check('object', $var, $nullAllowed);
}
function checkClass($className, $object, $nullAllowed = false)
{
return Typage::check("class:$className", $object, $nullAllowed);
}
function checkArray($var, $nullAllowed = false)
{
return Typage::check('array', $var, $nullAllowed);
}
function checkArrayOf($elementsType, $array, $nullAllowed = false)
{
foreach ($array as $element) {
try {
Typage::check($elementType, $element);
}
catch (TypeException $e) {
Typage::raiseException("ArrayOf:$elementType");
}
}
return true;
}
function checkArrayOfClass($className, $array, $nullAllowed = false)
{
checkArrayOf("class:$className", $array, $nullAllowed);
return true;
}
}