PHP'de bir nesnenin boş olup olmadığı nasıl kontrol edilir?


Yanıtlar:


130

Bir diziye çevirebilir ve ardından boş olup olmadığını kontrol edebilirsiniz.

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

9
Typecasting benim için çalışmıyor çünkü şu hatayı alıyorum: PHP Ayrıştırma hatası: sözdizimi hatası, beklenmeyen '(dizi)' (dizi) (T_ARRAY_CAST) ... PHP 5.4.28 sürümünü ve ilk seçeneği kullanıyorum iki satır kod benim için çalışıyor.
Coanda

Bir WordPress eklentisi yüklerken aynı hatayı yaşadılar, görünüşe göre PHP'nin eski bir sürümünü kullanıyorlar.
Asaf

4
Bir dizi, boşsa aslında kontrol etmez boşaltmak empty($var)eşdeğer (!isset($var) || !$var). Eğer yerine empty($arr)birlikteyken !$arrberiarray() == FALSE
Timothy Zorn

2
Bunun nedeni empty((array) $obj)PHP 5.4+ sürümünde çalışmıyor, tek satırda yazım yapmakla ilgisi yok. Hatayı alırsınız çünkü empty()ona geçirilen değişkenlere bir referans alır ve tipe dönüştürülmüş değişkeni başka bir değişkende ilk olarak saklamadığınız sürece tipleme yaparken bir referans alamaz. Bunu önceki yorumumda anlattığım şey yüzünden yapıyor. İnsanların empty()bir dizinin "boş" olup olmadığını kontrol ettiğine inanmasına neden olabileceğinden, bunun kabul edilen cevap olması oldukça sinir bozucu, ki bu doğru değil - bu, gerçekte ne yaptığının sadece bir yan etkisi.
Timothy Zorn

Php 7 + 'da çalışacak mı, yoksa düzeltmenin doğru yolu mu?
kantsverma

32

Düzenleme : Bir SimpleXMLElement nesnesinin boş olup olmadığını özellikle kontrol etmek istediklerini fark etmemiştim. Eski cevabı aşağıda bıraktım

Güncellenmiş Cevap (SimpleXMLElement) :

SimpleXMLElement için:

Boş derken hiçbir özelliği olmadığını kastediyorsunuz:

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

VEYA

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

SimpleXMLElement bir seviye derinse ve boş derken aslında sadece PHP'nin falsey olarak kabul ettiği özelliklere sahip olduğunu kastediyorsunuz (veya hiçbir özelliği yok):

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

SimpleXMLElement birden fazla düzeydeyse, onu saf bir diziye dönüştürerek başlayabilirsiniz:

$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
}


Eski Cevap (basit nesne) :

Basit bir nesnenin (tür stdClass) tamamen boş olup olmadığını kontrol etmek istiyorsanız (anahtar / değer yok), aşağıdakileri yapabilirsiniz:

// $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";
}

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

Düzenleme : eklenmiş örnek

$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

PHP7.2'de çalışmıyor:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen

2
@ juha-untinen ile çözüm, ->count()örnekleri SimpleXMLElementiçin değil , özellikle örnekleri içindir stdClass. Tüm bunların hala PHP7.2'de çalıştığına inanıyorum.
Timothy Zorn

21

Nesnenizi bir diziye çevirebilir ve sayısını şu şekilde test edebilirsiniz:

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

12

Nesne boş değilse ve bir bakıma oldukça büyükse, onu diziye dönüştürmek ya da serileştirmek için kaynakları neden boşa harcayasınız ki ...

Bu, JavaScript'te kullandığım çok kolay bir çözüm. Bir nesneyi diziye dönüştüren ve boş olup olmadığını kontrol eden veya JSON olarak kodlayan söz konusu çözümün aksine, bu basit işlev, basit bir görevi gerçekleştirmek için kullanılan kaynaklar açısından çok etkilidir.

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

    return TRUE;
}

Çözüm çok basit bir şekilde çalışıyor: Nesne boşsa ve geri dönecekse foreach döngüsüne hiç girmeyecek true. Boş değilse, tüm setten geçmeden foreachdöngüye girecek ve falsehemen geri dönecektir .


8

Kullanılması empty()çünkü bir nesne üzerinde kullanırken her zamanki gibi işe yaramaz __isset()ilan takdirde aşırı yöntem yerine çağrılacak.

Bu nedenle kullanabilirsiniz count()(nesne Sayılabilir ise ).

Veya get_object_vars()örneğin kullanarak

get_object_vars($obj) ? TRUE : FALSE;

7

Yayınlamaya ihtiyaç duymayan başka bir olası çözüm 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 ) );

2

bir nesnenin boş olup olmadığını kontrol etmenin benzersiz güvenli bir yolu yoktur

php's count () diziye ilk çevirir, ancak çevrim boş bir dizi üretebilir, nesnenin nasıl uygulandığına bağlıdır (uzantıların nesneleri genellikle bu sorunlardan etkilenir)

sizin durumunuzda $ obj-> count () kullanmanız gerekir;

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

(bu php'nin sayısı değil http://www.php.net/count )


1

PHP'de herhangi bir şeyi (bool) olarak çevirirseniz, öğenin bir nesne mi, ilkel tür mü yoksa boş mu olduğunu hemen söyleyecektir. Aşağıdaki kodu kullanın:

$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
yanlış. $ x = new \ stdClass (); var_dump ((bool) $ x); 'true' yazdırır; Sizin durumunuzda, simpleXml bazı durumlarda yanlış döndürebilir
Quamis

Doğru. new stdClass () geçerli bir nesnedir, bu yüzden doğrudur. PHP kılavuzu, simplexml_load_file (), "XML belgesinde tutulan verileri içeren özelliklere sahip SimpleXMLElement sınıfının bir nesnesini veya başarısızlık durumunda FALSE döndürür" der. Yani, eğer (bool) simplexml_load_file () çevirirseniz, doğru olacaktır (çünkü işlev bir nesne döndürmüştür) ama yanlış olacaktır (çünkü işlev yanlış döndürmüştür).
roosevelt

0

Bir nesnenin "boş" olması veya olmaması bir tanım meselesiyse ve sınıfın temsil ettiği nesnenin doğasına bağlı olduğu için, tanımlaması sınıfın kendisine aittir.

PHP, bir sınıfın her örneğini boş değil olarak görür.

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

// results in bool(false)

"Boş" bir nesne için genel bir tanım olamaz. Yukarıdaki örnekte sonucunun empty()olması gerektiğini true, çünkü nesnenin herhangi bir içeriği temsil etmediğini iddia edebilirsiniz . Fakat PHP nasıl bilinmeli? Bazı nesneler asla içeriği temsil etme amacını taşımaz (örneğin fabrikaları düşünün), diğerleri her zaman anlamlı bir değeri temsil eder (düşünün new DateTime()).

Kısacası, belirli bir nesne için kendi kriterlerinizi bulmanız ve bunları nesnenin dışından veya nesnede kendi kendine yazılan bir isEmpty()yöntemle buna göre test etmeniz gerekecektir .



-1

Gönderi isteğinde bir dizenin json_decode'unu kullanıyordum. Yukarıdakilerin hiçbiri benim için işe yaramadı, sonunda şunu kullandım:

$post_vals = json_decode($_POST['stuff']);

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.