web-dev-qa-db-fra.com

Comment vérifier qu'un objet est vide en PHP?

Comment savoir si un objet est vide ou non en PHP.

Voici le code dans lequel $obj contient des données XML. Comment puis-je vérifier si c'est vide ou pas?

Mon code:

$obj = simplexml_load_file($url);
89
sandbox

Vous pouvez transtyper un tableau et vérifier ensuite s'il est vide ou non

$arr = (array)$obj;
if (empty($arr)) {
    // do stuff
}

Edit: La conversion d'une seule ligne, comme ci-dessous, ne fonctionne pas dans PHP 5.4:

if (empty((array) $obj)) {
    //do stuff
}
112
Peter Kelly

Edit : Je n'avais pas compris qu'ils voulaient vérifier spécifiquement si un objet SimpleXMLElement est vide. J'ai laissé l'ancienne réponse ci-dessous

Réponse mise à jour (SimpleXMLElement) :

Pour SimpleXMLElement:

Si par vide vous voulez dire n'a pas de propriétés:

$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
    // no properties
}

OR

$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
    // empty array
}

Si SimpleXMLElement a une profondeur d'un niveau, et par vide vous voulez dire qu'il n'a que des propriétés PHP considère falsey (ou aucune propriété):

$obj = simplexml_load_file($url);
if ( !array_filter((array)$obj) )
{
    // all properties falsey or no properties at all
}

Si SimpleXMLElement a plus d'un niveau, vous pouvez commencer par le convertir en tableau pur:

$obj = simplexml_load_file($url);
// `json_decode(json_encode($obj), TRUE)` can be slow because
// you're converting to and from a JSON string.
// I don't know another simple way to do a deep conversion from object to array
$array = json_decode(json_encode($obj), TRUE);
if ( !array_filter($array) )
{
    // empty or all properties falsey
}

Ancienne réponse (objet simple) :

Si vous voulez vérifier si un objet simple (type stdClass) est complètement vide (pas de clé/valeur), vous pouvez procéder comme suit:

// $obj is type stdClass and we want to check if it's empty
if ( $obj == new stdClass() )
{
    echo "Object is empty"; // JSON: {}
}
else
{
    echo "Object has properties";
}

Source: http://php.net/manual/en/language.oop5.object-comparison.php

Edit : exemple ajouté

$one = new stdClass();
$two = (object)array();

var_dump($one == new stdClass()); // TRUE
var_dump($two == new stdClass()); // TRUE
var_dump($one == $two); // TRUE

$two->test = TRUE;
var_dump($two == new stdClass()); // FALSE
var_dump($one == $two); // FALSE

$two->test = FALSE;
var_dump($one == $two); // FALSE

$two->test = NULL;
var_dump($one == $two); // FALSE

$two->test = TRUE;
$one->test = TRUE;
var_dump($one == $two); // TRUE

unset($one->test, $two->test);
var_dump($one == $two); // TRUE
29
Timothy Zorn

Vous pouvez transtyper votre objet dans un tableau et tester son nombre comme ceci:

if(count((array)$obj)) {
   // doStuff
}
16
Mohamed23gharbi

L'utilisation de empty() ne fonctionnera pas comme d'habitude lorsque vous l'utilisez sur un objet, car la méthode de surcharge __isset() sera appelée à la place, si elle est déclarée.

Par conséquent, vous pouvez utiliser count() (si l'objet est Countable ).

Ou en utilisant get_object_vars(), par ex.

get_object_vars($obj) ? TRUE : FALSE;
7
kenorb

Imaginez que si l'objet n'est pas vide et qu'il soit assez gros, pourquoi gaspilleriez-vous les ressources pour le lancer en matrice ou en série ...

C’est une solution très simple que j’utilise en JavaScript. Contrairement à la solution mentionnée qui convertit un objet dans un tableau et vérifie s'il est vide ou s'il est codé en JSON, cette fonction simple est très efficace en ce qui concerne les ressources utilisées pour effectuer une tâche simple.

function emptyObj( $obj ) {
    foreach ( $obj AS $prop ) {
        return FALSE;
    }

    return TRUE;
}

La solution fonctionne d'une manière très simple: elle ne entrera pas du tout dans une boucle foreach si l'objet est vide et retournera true. S'il n'est pas vide, il entrera dans la boucle foreach et retournera false immédiatement, sans passer par l'ensemble.

7
stamat

Une autre solution possible qui n’a pas besoin de transtyper en array:

// test setup
class X { private $p = 1; } // private fields only => empty
$obj = new X;
// $obj->x = 1;


// test wrapped into a function
function object_empty( $obj ){
  foreach( $obj as $x ) return false;
  return true;
}


// inline test
$object_empty = true;
foreach( $obj as $object_empty ){ // value ignored ... 
  $object_empty = false; // ... because we set it false
  break;
}


// test    
var_dump( $object_empty, object_empty( $obj ) );
7
biziclop

il n'y a pas de moyen sûr unique de vérifier si un objet est vide

la fonction count () de PHP () commence par un tableau, mais le casting peut produire un tableau vide, cela dépend de la manière dont l'objet est implémenté (les objets des extensions sont souvent affectés par ces problèmes)

dans votre cas, vous devez utiliser $ obj-> count ();

http://it.php.net/manual/en/simplexmlelement.count.php

(ce n'est pas le compte de php http://www.php.net/count )

2
user652649

Si vous transformez quelque chose en PHP en tant que (bool), il vous dira immédiatement si l'élément est un objet, un type primitif ou null. Utilisez le code suivant:

$obj = simplexml_load_file($url);

if (!(bool)$obj) {
    print "This variable is null, 0 or empty";
} else {
    print "Variable is an object or a primitive type!";
}
1
roosevelt

Si un objet est "vide" ou non, c'est une question de définition, et comme cela dépend de la nature de l'objet représenté par la classe, c'est à la classe de définir.

PHP lui-même considère que chaque instance d'une classe n'est pas vide.

class Test { }
$t = new Test();
var_dump(empty($t));

// results in bool(false)

Il ne peut y avoir de définition générique pour un objet "vide". Dans l'exemple ci-dessus, le résultat de empty() devrait être true, car l'objet ne représente aucun contenu. Mais comment savoir PHP? Certains objets ne sont jamais censés représenter un contenu (pensez à des usines, par exemple), d’autres représentent toujours une valeur significative (think new DateTime()).

En bref, vous devrez définir vos propres critères pour un objet spécifique et les tester en conséquence, que ce soit de l'extérieur de l'objet ou d'une méthode auto-écrite isEmpty() dans l'objet.

0
nem75
$array = array_filter($array);
if(!empty($array)) {
    echo "not empty";
}

ou

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}
0
Muhammad Tahir