Cara mendefinisikan objek kosong di PHP

384

dengan array baru saya melakukan ini:

$aVal = array();

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

Apakah ada sintaksis yang mirip untuk suatu objek

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
ed209
sumber
13
$var = (object) (boolean) (string) (int) (array) new StdClass; Anda tahu, hanya untuk aman.
Xeoncross
1
Google telah diindeks judul pertanyaan ini sebagai: Arrays - How to define an empty object in PHP. Tidak ada hubungannya dengan array
Kolob Canyon

Jawaban:

848
$x = new stdClass();

Sebuah komentar di manual merangkum itu terbaik:

stdClass adalah objek PHP default. stdClass tidak memiliki properti, metode, atau induk. Itu tidak mendukung metode ajaib, dan tidak mengimplementasikan antarmuka.

Ketika Anda melemparkan skalar atau array sebagai Object, Anda mendapatkan instance dari stdClass. Anda dapat menggunakan stdClass kapan pun Anda membutuhkan instance objek generik.

zombat
sumber
5
$ o = (objek) NULL; - Jika suatu objek dikonversi ke objek, itu tidak dimodifikasi. Jika nilai tipe apa pun dikonversi ke objek, instance baru dari kelas bawaan stdClass dibuat. Jika nilainya NULL, instance baru akan kosong. Array dikonversi ke objek dengan properti yang dinamai dengan kunci, dan nilai yang sesuai. Untuk nilai lain apa pun, variabel anggota bernama skalar akan berisi nilai tersebut.
DDS
11
Saya hanya mengatakan stdClassdi kepala saya sebagai "kelas standar"
sjagr
1
Jika Anda terus lupa gunakan jawaban saya :)
RafaSashi
26
Jika Anda menemukan "tidak ditemukan": new \stdClass(); PHP Namespace Doc
2540625
3
@IvanCastellanos dapatkah Anda menjelaskan bagaimana Anda dapat mengingat stdClass()dari kata itu AIDS?
Adam
117

Cara standar untuk membuat objek "kosong" adalah:

$oVal = new stdClass();

Tetapi, dengan PHP> = 5.4, saya pribadi lebih suka menggunakan:

$oVal = (object)[];

Ini lebih pendek dan saya pribadi menganggapnya lebih jelas karena stdClass dapat menyesatkan programmer pemula (yaitu "Hei, saya ingin objek, bukan kelas!" ...).

Sama dengan PHP <5.4 adalah:

$oVal = (object) array();

(object)[]setara dengan new stdClass().

Lihat manual PHP ( sini ):

stdClass : Dibuat oleh typecasting ke objek.

dan ( sini ):

Jika suatu objek dikonversi ke objek, itu tidak dimodifikasi. Jika nilai tipe apa pun dikonversi ke objek, instance baru dari kelas bawaan stdClass dibuat .


Namun ingat itu kosong ($ oVal) mengembalikan false , seperti yang dikatakan @PaulP:

Objek tanpa properti tidak lagi dianggap kosong.

Mengenai contoh Anda, jika Anda menulis:

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

PHP membuat Peringatan berikut ini, secara implisit membuat properti key1 (objek itu sendiri)

Peringatan: Membuat objek default dari nilai kosong

Ini bisa menjadi masalah jika konfigurasi Anda (lihat tingkat pelaporan kesalahan ) menunjukkan peringatan ini ke browser. Ini adalah seluruh topik lain, tetapi pendekatan cepat dan kotor bisa menggunakan operator kontrol kesalahan (@) untuk mengabaikan peringatan:

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";
cgaldiolo
sumber
3
Alih-alih memperbaiki masalah, Anda malah membuat yang baru. Masalah yang perlu diperbaiki adalah orang harus tahu apa yang harus stdClassdilakukan.
Pacerier
2
Saya menulis apa stdClass. Saya menggunakan stdClasskode yang menjawab pertanyaan. Maaf, saya tidak membuat masalah baru, itu pendapat pribadi saya (seperti yang saya tulis).
cgaldiolo
6
"preferensi pribadi"! = "masalah"
cgaldiolo
4
@Pacerier, saya tidak mengerti sikap keras kepala Anda. Pertanyaannya adalah 'Bagaimana cara mendefinisikan objek kosong di PHP'. Jawaban saya benar dan saya menulis untuk menggunakan "stdClass baru ()". Kode yang saya berikan kepada pengguna 'ed209' benar dan saya menggunakan "stdClass baru ()". Selain itu saya menambahkan pendapat pribadi dan saya menggunakan huruf tebal "pribadi" untuk menjadi jelas bahwa itu bukan cara "standar" untuk pergi. Menurut pendapat saya yang sederhana masalah yang layak menerima begitu banyak komentar harus setidaknya merupakan jawaban yang salah. Alih-alih jika Anda menganggap pendapat pribadi sebagai masalah, mungkin ini adalah masalah untuk berbagi gagasan secara konstruktif.
cgaldiolo
9
Saya sangat suka tulisan cepat(object) []
Rahil Wazir
35

Saya ingin menunjukkan bahwa dalam PHP tidak ada yang namanya objek kosong:

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

tapi tentu saja $ obj akan kosong.

Di sisi lain, array kosong berarti kosong dalam kedua kasus

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

Kutipan dari fungsi changelog kosong

Objek tanpa properti tidak lagi dianggap kosong.

PaulP
sumber
Saya tidak dapat menemukan kutipan di changelog untuk kosong.
powpow12
@ powpow12 Dulu ada di sana . Itu diubah di 5.0.0.
Stanley Umeanozie
18

php.net mengatakan yang terbaik:

$new_empty_object = new stdClass();
HungryCoder
sumber
Ya, ini pasti cara yang disarankan.
Hudson Pereira
14

Saya suka betapa mudahnya membuat objek jenis anonim dalam JavaScript:

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

Jadi saya selalu mencoba untuk menulis objek semacam ini di PHP seperti yang dilakukan javascript :

//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

Tetapi karena ini pada dasarnya adalah array, Anda tidak dapat melakukan hal-hal seperti menetapkan fungsi anonim ke properti seperti js:

//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)"

Ya, Anda bisa melakukannya, tetapi IMO tidak praktis / bersih:

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

Selain itu, menggunakan synthax ini Anda dapat menemukan beberapa kejutan lucu , tetapi berfungsi dengan baik untuk sebagian besar kasus.

campsjo
sumber
1
Ini harus menjadi jawaban yang diterima
Mike Aron
11

Selain jawaban zombat jika Anda terus lupa stdClass

   function object(){

        return new stdClass();

    }

Sekarang Anda bisa melakukannya:

$str='';
$array=array();
$object=object();
RafaSashi
sumber
Saya suka teknik ini, meskipun sebagian besar IDE tidak akan menyoroti istilah "objek" sebagai fungsi yang bisa membingungkan programmer lain. Tapi hei, itu berhasil untuk saya!
Brixster
7

Anda dapat menggunakan new stdClass()(yang disarankan):

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

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

Atau Anda dapat mengonversi array kosong ke objek yang menghasilkan instance kosong baru dari kelas bawaan stdClass:

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

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

Atau Anda bisa mengonversi nullnilai menjadi objek yang menghasilkan instance kosong baru dari kelas bawaan stdClass:

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

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

untuk mengakses data dalam stdClass dengan cara yang mirip dengan yang Anda lakukan dengan array asosiatif cukup gunakan sintaks {$ var}.

$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};
GCoro
sumber
4

Seperti yang telah ditunjukkan orang lain, Anda dapat menggunakan stdClass. Namun saya pikir ini lebih bersih tanpa (), seperti:

$obj = new stdClass;

Namun berdasarkan pertanyaan, sepertinya yang Anda inginkan adalah dapat menambahkan properti ke objek dengan cepat. Anda tidak perlu menggunakan stdClass untuk itu, meskipun Anda bisa. Sungguh Anda bisa menggunakan kelas apa saja. Cukup buat instance objek dari kelas apa pun dan mulailah mengatur properti. Saya suka membuat kelas sendiri yang namanya hanya o dengan beberapa fungsi dasar dasar yang saya suka gunakan dalam kasus ini dan bagus untuk memperluas dari kelas lain. Pada dasarnya ini adalah kelas objek dasar saya sendiri. Saya juga suka memiliki fungsi bernama o (). Seperti itu:

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

function o() {
  return new o;
}

Jika Anda tidak suka memiliki tipe objek basis Anda sendiri, Anda dapat meminta o () mengembalikan stdClass baru. Satu keuntungan adalah bahwa o lebih mudah diingat daripada stdClass dan lebih pendek, terlepas dari apakah Anda menggunakannya sebagai nama kelas, nama fungsi, atau keduanya. Bahkan jika Anda tidak memiliki kode apa pun di dalam kelas Anda, masih lebih mudah untuk menghafal daripada stdClass dengan huruf kapital dan canggung (yang mungkin memunculkan ide 'kelas penyakit menular seksual'). Jika Anda menyesuaikan kelas o, Anda mungkin menemukan penggunaan fungsi o () alih-alih sintaks konstruktor. Ini adalah fungsi normal yang mengembalikan nilai, yang kurang terbatas daripada konstruktor. Misalnya, nama fungsi dapat diteruskan sebagai string ke fungsi yang menerima parameter yang bisa dipanggil. Suatu fungsi juga mendukung perangkaian. Jadi Anda dapat melakukan sesuatu seperti:

Ini adalah awal yang bagus untuk "bahasa" dasar untuk membangun lapisan bahasa lain dengan lapisan atas ditulis dalam DSL internal penuh. Ini mirip dengan gaya pengembangan lisp, dan PHP mendukungnya jauh lebih baik daripada yang disadari kebanyakan orang. Saya menyadari ini sedikit menyinggung pertanyaan, tetapi pertanyaan menyentuh pada apa yang saya pikir adalah dasar untuk sepenuhnya memanfaatkan kekuatan PHP.

still_dreaming_1
sumber
2
@Pacerier maksudmu tanpa orangtua? ;) cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1
1
Itu salah ketik, seharusnya tanpa orangtua.
Pacerier
@Pacerier poin bagus english.stackexchange.com/questions/130219/…
still_dreaming_1
4

Jika Anda ingin membuat objek (seperti dalam javascript) dengan properti dinamis, tanpa menerima peringatan properti tidak terdefinisi.

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
fredtma
sumber
4

Anda dapat mencoba cara ini juga.

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

Keluaran:

object(stdClass)#1 (0) { }
Mukesh Jeengar
sumber
4

Gunakan objek generik dan petakan pasangan nilai kunci untuk itu.

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

Atau melemparkan array ke objek

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
Anthony Awuley
sumber
3

Jika Anda tidak ingin melakukan ini:

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

Anda dapat menggunakan salah satu dari yang berikut:

PHP> = 5.4

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

PHP <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);
Vasil Nikolov
sumber
3

Berikut sebuah contoh dengan iterasi:

<?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; ?>
fingerman
sumber
0

Anda memiliki teknik yang buruk namun bermanfaat ini:

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

stdClass adalah objek PHP default. stdClass tidak memiliki properti, metode, atau induk. Itu tidak mendukung metode ajaib, dan tidak mengimplementasikan antarmuka.

Ketika Anda melemparkan skalar atau array sebagai Object, Anda mendapatkan instance dari stdClass. Anda dapat menggunakan stdClass kapan pun Anda membutuhkan instance objek generik.

<?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 BUKAN kelas dasar! Kelas PHP tidak secara otomatis mewarisi dari kelas mana pun. Semua kelas berdiri sendiri, kecuali mereka secara eksplisit memperluas kelas lain. PHP berbeda dari banyak bahasa berorientasi objek dalam hal ini.

<?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)
?>

Anda tidak dapat mendefinisikan kelas bernama 'stdClass' dalam kode Anda. Nama itu sudah digunakan oleh sistem. Anda dapat mendefinisikan kelas bernama 'Objek'.

Anda bisa mendefinisikan kelas yang memperluas stdClass, tetapi Anda tidak akan mendapat manfaat, karena stdClass tidak melakukan apa-apa.

(diuji pada PHP 5.2.8)

Harshal Lonare
sumber