web-dev-qa-db-fra.com

Impossible de transmettre un argument null lors de l'utilisation de l'indicateur de type

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?

156
Abdullah

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 sur NULL.

284
DonCallisto

À 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.

32
TheOperator

Essayer:

function foo(Type $t = null) {

}

Départ arguments de la fonction PHP .

11
SeanWM

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);
4
Fabian Schmengler