Le code suivant:
<?php
class Type {
}
function foo(Type $t) {
}
foo(null);
?>
a échoué au moment de l'exécution:
PHP Fatal error: Argument 1 passed to foo() must not be null
Pourquoi n'est-il pas autorisé à passer null comme les autres langues?
PHP 7.1 ou plus récent (publié le 2 décembre 2016)
Vous pouvez explicitement déclarer une variable comme étant null
avec cette syntaxe.
function foo(?Type $t) {
}
cela se traduira par
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Donc, si vous voulez un argument optionnel, vous pouvez suivre la convention Type $t = null
alors que si vous devez argumenter accepter à la fois null
et son type, vous pouvez suivre l'exemple ci-dessus.
Vous pouvez en lire plus ici .
PHP 7.0 ou plus ancien
Vous devez ajouter une valeur par défaut comme
function foo(Type $t = null) {
}
De cette façon, vous pouvez lui passer une valeur nulle.
Ceci est documenté dans la section du manuel concernant type déclarations :
Vous pouvez déclarer que vous acceptez les valeurs
NULL
si la valeur par défaut du paramètre est définie surNULL
.
À partir de PHP 7.1, des types nullables sont disponibles, car les types de retour de fonction et Le type ?T
peut avoir les valeurs du type spécifié T
ou null
.
Donc, votre fonction pourrait ressembler à ceci:
function foo(?Type $t)
{
}
Dès que vous pouvez utiliser PHP 7.1, cette notation doit être préférée à function foo(Type $t = null)
], car elle oblige toujours l'appelant à spécifier explicitement un argument pour le paramètre $t
.
Comme d'autres réponses déjà mentionnées, ceci n'est possible que si vous spécifiez null
comme valeur par défaut.
Mais la solution orientée objet la plus propre possible serait un NullObject :
interface FooInterface
{
function bar();
}
class Foo implements FooInterface
{
public function bar()
{
return 'i am an object';
}
}
class NullFoo implements FooInterface
{
public function bar()
{
return 'i am null (but you still can use my interface)';
}
}
Usage:
function bar_my_foo(FooInterface $foo)
{
if ($foo instanceof NullFoo) {
// special handling of null values may go here
}
echo $foo->bar();
}
bar_my_foo(new NullFoo);