Nesne PHP boş olup olmadığını nasıl kontrol edebilirim?

3 Cevap php

PHP ile JSON veri okuyorum ve bu veri (} {gibi) boş nesneleri içerir. Yani sorun ben nesne farklı bir şekilde boş olduğunda davayı işlemek zorunda ama ben bir kontrol yapmak için yeterince iyi bir yol bulamıyorum, olduğunu. empty(get_object_vars(object)) çok korkutucu ve çok verimsiz görünüyor. Denetimi yapmak için iyi bir yolu var mı?

3 Cevap

Kaç nesneleri unserializing edilir? empty(get_object_vars($object)) ya da dizi döküm önemli bir yavaşlama / darboğaz olduğunu kanıtlamaktadır sürece, bunu dert etmem - Greg'in çözüm sadece iyi.

Ama, JSON veri çözerken $associative bayrağını kullanarak öneririm:

json_decode($data, true)

Bu stdClass nesneler olarak düz eski PHP diziler yerine olarak JSON nesneleri çözer. Sonra empty() kullanarak boş nesneleri kontrol ve muhtemelen uzun vadede iyi bir fikir yerine stdClass kullanarak kullanıcı tanımlı bir sınıfın nesneleri oluşturabilirsiniz.

Bir dizi için döküm olabilir (ne yazık ki bir çağrı içinde bu yapamam empty():

$x = (array)$obj;
if (empty($x))
    ...

Ya da bir dizi artığını ve count():

if (count((array)$obj))
    ...

Ben bir nesne ya da boş değildi söylemek zorunda kaldım, ama aynı zamanda özel ve korunan özelliklerini görmezden vardı, bu yüzden ben bunu hangi ile bu küçük işlevi yaptı.

function empty_obj(&$object, $ignore_private = true, $ignore_protected = true) {
  $obj_name = get_class($object);
  $obj = (array)$object;

  foreach(array_keys($obj) as $prop) {
    $is_private = $is_protected = false;

    $prop = preg_replace("/[^\w*]/", '', $prop);
    $prop_name = str_replace(array($obj_name, '*'), '', $prop);

    if(preg_match("~^$obj_name$prop_name$~", $prop))
      $is_private = true;
    if(preg_match("~^\*$prop_name$~", $prop))
      $is_protected = true;

    if(!$is_private || !$is_protected || ($is_private && !$ignore_private) || ($is_protected && !$ignore_protected))
      return;
  }
  return true;
}