web-dev-qa-db-fra.com

is_null ($ x) vs $ x === null in PHP

Duplicate possible:
Quelle est la différence entre is_null ($ var) et ($ var === null)?

PHP a deux méthodes (à ma connaissance et trois si vous comptez isset()) pour déterminer si une valeur est nulle: is_null() et === null. J'ai entendu, mais je n'ai pas confirmé, que === null Est plus rapide, mais dans une révision de code, quelqu'un m'a fortement suggéré d'utiliser is_null() à la place car il est spécifiquement conçu à des fins d'évaluation null. Il a également commencé à parler de mathématiques ou de quelque chose du genre.

Quoi qu'il en soit, le fait que is_null() soit apparemment plus lent, me porte également à croire que le résultat est supérieur à celui de === null Et est probablement préféré. Y a-t-il une raison d'utiliser l'un ou l'autre? Est-ce qu'on préfère toujours? Qu'en est-il de isset()?

En tant qu'additif pour ne pas éventuellement résoudre cette question, qu'en est-il de isset() vs is_null()? Il semble que tout ce que isset() fera est de supprimer la notification. Ainsi, sauf si vous voulez une notification pour une variable non définie, toute raison d'utiliser is_null() au lieu? Que diriez-vous si vous savez que la variable est initialisée à ce moment?

Enfin, y a-t-il une raison mathématique de préférer is_null() à === null? Quelque chose à propos de null ne pas être comparable?

128
Explosion Pills

Il y a absolument pas la différence de fonctionnalités entre is_null Et === null.

La seule différence est que is_null Est une fonction et donc

  1. est légèrement plus lent (surcharge de l'appel de fonction)
  2. peut être utilisé comme rappel, par exemple array_map('is_null', $array).

Personnellement, j'utilise null === Chaque fois que je peux, car cela est plus cohérent avec les contrôles false === Et true ===.

Si vous le souhaitez, vous pouvez vérifier le code: is_identical_function (===) Et php_is_type (is_null) fait la même chose pour le cas IS_NULL.


La structure de langage associée isset() vérifie si la variable existe réellement avant d'effectuer la vérification null. Donc, isset($undefinedVar) ne lancera pas d’avis.

Notez également que isset() peut parfois renvoyer true même si la valeur est null - c'est le cas lorsqu'il est utilisé sur un objet surchargé, c'est-à-dire si l'objet définit offsetExists/__isset méthode qui retourne true même si l'offset est null (c'est en fait assez courant, car les gens utilisent array_key_exists dans offsetExists/__isset).

180
NikiC

Comme indiqué par d'autres, il existe un décalage horaire entre l'utilisation de === Et is_null(). J'ai fait quelques tests rapides et obtenu ces résultats:

<?php

//checking with ===
$a = array();
$time = microtime(true);
for($i=0;$i<10000;$i++) {
    if($a[$i] === null) {
         //do nothing
    }
}
echo 'Testing with === ', microtime(true) - $time, "\n";

//checking with is_null()
$time = microtime(true);
for($i=0;$i<10000;$i++) {
    if(is_null($a[$i])) {
         //do nothing
    }
}
echo 'Testing with is_null() ', microtime(true) - $time;
?>

Donne les résultats

Test avec === 0.0090668201446533

Test avec is_null () 0.013684034347534

Voir le code en action

12
jprofitt

Ils ont tous leur place, bien que seul isset () évite les avertissements de variable non définis:

$ php -a
Interactive Shell

php > var_dump(is_null($a));
PHP Notice:  Undefined variable: a in php Shell code on line 1
bool(true)
php > var_dump($a === null);
PHP Notice:  Undefined variable: a in php Shell code on line 1
bool(true)
php > var_dump(isset($a));
bool(false)
php >
5
Marc B

Vous avez besoin de isset() si la variable n'est peut-être pas définie. Il renvoie false lorsque la variable n'est pas définie ou === null (Oui, c'est ça moche). Seuls isset() et empty() ne déclenchent pas un E_NOTICE si la variable ou l'élément de tableau n'existe pas.

Il n'y a pas vraiment de différence entre is_null Et === null. Je pense que === Est bien meilleur, mais quand vous par exemple Si vous devez utiliser call_user_func pour une raison douteuse, vous devrez utiliser is_null.

4
ThiefMaster

Je ne suis pas en mesure de dire s'il vaut mieux utiliser is_null Ou === null. Mais soyez conscient lorsque vous utilisez isset sur des tableaux.

$a = array('foo' => null);

var_dump(isset($a['foo'])); // false
var_dump(is_null($a['foo'])); // true
var_dump(array_key_exists('foo', $a)); // true
4
mAu

=== et is_null est le même.

Selon ce commentaireis_null n'est que 250ns plus lent. Je pense qu'une fonction est plus lente qu'un opérateur.

3
PiTheNumber

Le documentation PHP a une bonne discussion et des expériences sur is_null, === null, isset. Surtout lisez la section commentaire.

2
Shakti Singh