PHP'de boş bir nesne nasıl tanımlanır


384

yeni bir dizi ile bunu:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

Bir nesne için benzer bir sözdizimi var mı

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

13
$var = (object) (boolean) (string) (int) (array) new StdClass; Sadece güvende olmak için.
Xeoncross

1
Google, bu soru başlığı endeksli etti: Arrays - How to define an empty object in PHP. Dizilerle ilgisi yoktur
Kolob Canyon

Yanıtlar:


848
$x = new stdClass();

Kılavuzdaki bir yorum en iyi şekilde özetliyor:

stdClass varsayılan PHP nesnesidir. stdClass öğesinde özellik, yöntem veya üst öğe yoktur. Sihirli yöntemleri desteklemez ve hiçbir arabirim uygulamaz.

Bir skaler veya dizi Nesne olarak yayınladığınızda, stdClass örneği alırsınız. Genel nesne örneğine ihtiyacınız olduğunda stdClass'ı kullanabilirsiniz.


5
$ o = (nesne) NULL; - Bir nesne bir nesneye dönüştürülürse, değiştirilmez. Başka türde bir değer bir nesneye dönüştürülürse, stdClass yerleşik sınıfının yeni bir örneği oluşturulur. Değer NULL ise, yeni örnek boş olacaktır. Diziler, anahtarlarla adlandırılmış özelliklere ve karşılık gelen değerlere sahip bir nesneye dönüştürülür. Diğer herhangi bir değer için, scalar adlı bir üye değişken değeri içerir.
DDS

11
Sadece stdClasskafamda "standart sınıf"
diyorum


26
"Bulunamadı" ile karşılaşırsanız: new \stdClass(); PHP Namespace Doc
2540625

3
@IvanCastellanos Eğer hatırlıyorum nasıl açıklayabilir stdClass()kelimesinden AIDS?
Adam

117

"Boş" bir nesne oluşturmanın standart yolu:

$oVal = new stdClass();

Ancak, PHP> = 5.4 ile şahsen kullanmayı tercih ederim:

$oVal = (object)[];

Daha kısadır ve kişisel olarak daha net olduğunu düşünüyorum çünkü stdClass acemi programcılara yanıltıcı olabilir (yani "Hey, bir sınıf değil, bir nesne istiyorum!" ...).

PHP <5.4 ile aynıdır:

$oVal = (object) array();

(object)[]eşittir new stdClass().

PHP kılavuzuna bakın ( burada ):

stdClass : Nesneye yazarak oluşturulur.

ve ( burada ):

Bir nesne bir nesneye dönüştürülürse, değiştirilmez. Başka türde bir değer bir nesneye dönüştürülürse , stdClass yerleşik sınıfının yeni bir örneği oluşturulur .


Ancak @ PaulP'nin dediği gibi boş ($ oVal) ifadesinin false döndürdüğünü unutmayın:

Özelliği olmayan nesneler artık boş kabul edilmez.

Örneğinizle ilgili olarak şunları yazarsanız:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

PHP, örtük olarak özelliği key1(bir nesnenin kendisi) oluşturarak aşağıdaki Uyarıyı oluşturur

Uyarı: Boş değerden varsayılan nesne oluşturma

Yapılandırmanız ( hata raporlama düzeyine bakın ) tarayıcıda bu uyarıyı gösteriyorsa, bu bir sorun olabilir . Bu başka bir konudur, ancak hızlı ve kirli bir yaklaşım , uyarıyı yok saymak için hata kontrol operatörünü (@) kullanmak olabilir :

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";

3
Sorunu çözmek yerine yeni bir sorun oluşturuyorsunuz. Düzeltilmesi gereken sorun insanların ne yaptığını bilmeleri stdClass.
Pacerier

2
Ne yazdım stdClass. Kullandığım stdClasssorunun cevabının kodu. Üzgünüm ama yeni bir problem yaratmıyorum, bu benim kişisel görüşümdü (yazdığım gibi).
cgaldiolo

6
"kişisel tercih"! = "sorun"
cgaldiolo

4
@ Pacer, inatçılığını anlamıyorum. Soru 'PHP'de boş bir nesne nasıl tanımlanır' idi. Cevabım doğru ve "yeni stdClass ()" kullanmak için yazdım. 'Ed209' kullanıcısına sağladığım kod doğru ve "new stdClass ()" kullandım. Ayrıca kişisel bir görüş ekledi ve ben "standart" yol değildi açık olmak için cesur bir "şahsen" kullanılır. Benim düşünceme göre, bu kadar çok yorumu hak eden bir sorun en azından yanlış bir cevap olmalıdır. Bunun yerine, kişisel bir görüşü bir sorun olarak görüyorsanız, belki de bu fikirlerin yapıcı bir şekilde paylaşılması için bir sorundur.
cgaldiolo

9
(object) []
Stenoyu

35

PHP'de boş nesne gibi bir şey olmadığını belirtmek istiyorum:

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

ama elbette $ obj boş olacak.

Öte yandan boş dizi her iki durumda da boş anlamına gelir

$arr = array();
var_dump(empty($arr));

Changelog işlevinden alıntı boş

Özelliği olmayan nesneler artık boş kabul edilmez.


Boş için changelog bu teklifi bulamadım.
powpow12

@ powpow12 Eskiden oradaydı . 5.0.0'da değiştirildi.
Stanley Umeanozie


14

JavaScript'te anonim tipte nesneler oluşturmanın ne kadar kolay olduğunu seviyorum:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

Bu yüzden her zaman javascript yaptığı gibi PHP nesnelerin bu tür yazmaya çalışın :

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

Ancak bu temelde bir dizi olduğundan, js gibi bir özelliğe anonim işlev atama gibi şeyler yapamazsınız:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

Bunu yapabilirsiniz, ancak IMO pratik / temiz değildir:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

Ayrıca, bu sentaksı kullanarak bazı komik sürprizler bulabilirsiniz , ancak çoğu durumda iyi çalışır.


1
Bu kabul edilen cevap olmalı
Mike Aron

11

Unutmaya devam ederseniz zombatın cevabına ek olarak stdClass

   function object(){

        return new stdClass();

    }

Şimdi şunları yapabilirsiniz:

$str='';
$array=array();
$object=object();

Çoğu IDE, "nesne" terimini diğer programcılar için kafa karıştırıcı bir işlev olarak vurgulamasa da, bu tekniği seviyorum. Ama hey, benim için çalışıyor!
Brixster

7

Şunları kullanabilirsiniz new stdClass()(önerilen):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

Veya boş bir diziyi stdClass yerleşik sınıfının yeni bir boş örneğini üreten bir nesneye dönüştürebilirsiniz:

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

Veya nulldeğeri, stdClass yerleşik sınıfının yeni bir boş örneğini üreten bir nesneye dönüştürebilirsiniz :

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 

5

Bir stdClass'ta verilere, benzer bir diziyle yaptığınız benzer bir şekilde erişmek için {$ var} sözdizimini kullanın.

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};

4

Diğerlerinin de belirttiği gibi, stdClass kullanabilirsiniz. Ancak () olmadan daha temiz olduğunu düşünüyorum, şöyle:

$obj = new stdClass;

Ancak soruya dayanarak, gerçekte istediğiniz bir nesneye anında özellikler ekleyebilmek gibi görünüyor. Bunu yapabilmek için stdClass kullanmanıza gerek yoktur. Gerçekten herhangi bir sınıfı kullanabilirsiniz. Herhangi bir sınıfın nesne örneğini oluşturun ve özellikleri ayarlamaya başlayın. Adı sadece bu durumlarda kullanmak gibi bazı temel genişletilmiş işlevsellik ile kendi sınıf oluşturmak istiyorum ve diğer sınıflardan genişletmek için güzel. Temelde benim kendi temel nesne sınıfım. Ayrıca o () adında bir işleve sahip olmayı seviyorum. Şöyle ki:

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

Kendi temel nesne türünüze sahip olmak istemiyorsanız, o () yönteminin yeni bir stdClass döndürmesi yeterlidir. Bir avantajı, stdClass'tan daha kolay hatırlanması ve bir sınıf adı, işlev adı veya her ikisi olarak kullanmanıza bakılmaksızın daha kısa olmasıdır. O sınıfınızda hiç kodunuz olmasa bile, ezberlemek garip bir şekilde büyük harfle yazılan ve adlandırılan stdClass'tan daha kolaydır (bu 'cinsel yolla bulaşan bir hastalık sınıfı' fikrini çağırabilir). O sınıfını özelleştirirseniz, yapıcı sözdizimi yerine o () işlevi için bir kullanım bulabilirsiniz. Bir yapıcıdan daha az sınırlı bir değer döndüren normal bir işlevdir. Örneğin, bir işlev adı, çağrılabilir bir parametreyi kabul eden bir işleve dize olarak geçirilebilir. Bir işlev zincirlemeyi de destekler. Böylece şöyle bir şey yapabilirsiniz:

Bu, bir üst "dil" in diğer dilde katmanlar oluşturması için harika bir başlangıçtır. Bu lisp geliştirme stiline benzer ve PHP bunu çoğu insanın düşündüğünden daha iyi destekler. Bunun soru için biraz teğet olduğunu anlıyorum, ancak soru PHP'nin gücünü tam olarak kullanmak için temel olduğunu düşündüğüm şeylere dokunuyor.



1
Bu bir yazım hatası, parantezsizlik olmalı.
Pacerier


4

Tanımlanmamış özellik uyarısı almadan dinamik özelliklere sahip nesne (javascript'teki gibi) oluşturmak istiyorsanız.

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null

4

Bu şekilde de deneyebilirsiniz.

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>

Çıktı:

object(stdClass)#1 (0) { }

4

Genel bir nesne kullanın ve anahtar değer çiftlerini onunla eşleyin.

$oVal = new stdClass();
$oVal->key = $value

Veya bir diziyi nesneye dök

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;

3

Bunu yapmak istemiyorsanız:

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

Aşağıdakilerden birini kullanabilirsiniz:

PHP> = 5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

PHP <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);

3

İşte yinelemeli bir örnek:

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>

0

Bu kötü ama kullanışlı bir tekniğiniz var:

$var = json_decode(json_encode([]), FALSE);

0

stdClass varsayılan PHP nesnesidir. stdClass öğesinde özellik, yöntem veya üst öğe yoktur. Sihirli yöntemleri desteklemez ve hiçbir arabirim uygulamaz.

Bir skaler veya dizi Nesne olarak yayınladığınızda, stdClass örneği alırsınız. Genel nesne örneğine ihtiyacınız olduğunda stdClass'ı kullanabilirsiniz.

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

stdClass bir temel sınıf DEĞİLDİR! PHP sınıfları otomatik olarak herhangi bir sınıftan miras almaz. Açıkça başka bir sınıfı genişletmedikçe tüm sınıflar bağımsızdır. PHP bu açıdan birçok nesne yönelimli dilden farklıdır.

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

Kodunuzda 'stdClass' adlı bir sınıf tanımlayamazsınız. Bu ad sistem tarafından zaten kullanılıyor. 'Nesne' adlı bir sınıf tanımlayabilirsiniz.

StdClass'ı genişleten bir sınıf tanımlayabilirsiniz, ancak stdClass hiçbir şey yapmadığı için hiçbir faydası olmaz.

(PHP 5.2.8'de test edilmiştir)

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.