Apa itu stdClass di PHP?

1049

Tolong jelaskan apa stdClassitu.

Keira
sumber

Jawaban:

785

stdClassadalah kelas kosong generik PHP, seperti Objectdi Jawa atau objectPython ( Edit: tetapi tidak benar-benar digunakan sebagai kelas dasar universal; terima kasih @Ciaran untuk menunjukkannya ).

Ini berguna untuk objek anonim, properti dinamis, dll.

Cara mudah untuk mempertimbangkan StdClass adalah sebagai alternatif dari array asosiatif. Lihat contoh ini di bawah ini yang menunjukkan bagaimana json_decode()memungkinkan untuk mendapatkan instance StdClass atau array asosiatif. Juga tetapi tidak ditampilkan dalam contoh ini, SoapClient::__soapCallmengembalikan instance StdClass.

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

Lihat Properti Dinamis dalam PHP dan StdClass untuk contoh lebih lanjut.

Alex Martelli
sumber
7
mungkin dia menggunakan mysql_fetch_object. yang membuat turunan stdlcass jika saya tidak salah.
Galen
69
Ini bukan kelas dasar seperti Java's Object, lihat jawaban saya di bawah ini.
Ciaran McNulty
1
Saya harap Anda tahu bahwa objek bukan kelas turunan dari "semua" objek di Python ... Setidaknya, tidak sampai Anda dipaksa untuk turun dari objek di Python 3.0
monokrome
11
Saya pikir orang harus mengatakan bahwa stdClass adalah sesuatu seperti {}konstruk JavaScript .
Earth Engine
Pak, jawaban Anda sebagian salah karena artikelnya salah. Satu-satunya (dan ini salah juga) hal yang memperluas kelas ini memberi Anda adalah opsi untuk mengetik petunjuknya yaitu function(StdClass $a, array $params)vs memeriksa apakah $aobjek dan instanceof.
Dejan Marjanovic
1114

stdClasshanya kelas generik 'kosong' yang digunakan saat casting tipe lain ke objek. Meskipun apa yang dua jawaban lain mengatakan, stdClassadalah tidak kelas dasar untuk objek di PHP. Ini dapat ditunjukkan dengan cukup mudah:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Saya tidak percaya ada konsep objek dasar dalam PHP

Ciaran McNulty
sumber
4
apa std berdiri untuk?
Adam Waite
47
std = standar -
Tomas Prado
1
Ini kelas utilitas! Btw ini komentar sebenarnya!
Gustav
16
Sebenarnya, kalimat pertama setelah potongan kode menjawab pertanyaan.
MauganRa
2
@Miro Markaravanes: Atribut dinamis dapat dengan ditugaskan ke kelas apa pun di PHP, bukan hanya stdClass.
StanE
95

stdClass adalah fitur PHP hebat lainnya. Anda dapat membuat kelas PHP anonim. Mari kita periksa contoh.

$page=new stdClass();
$page->name='Home';
$page->status=1;

sekarang anggap Anda memiliki kelas lain yang akan diinisialisasi dengan objek halaman dan jalankan basis di atasnya.

<?php
class PageShow {

    public $currentpage;

    public function __construct($pageobj)
    {
        $this->currentpage = $pageobj;
    }

    public function show()
    {
        echo $this->currentpage->name;
        $state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
        echo 'This is ' . $state . ' page';
    }
}

Sekarang Anda harus membuat objek PageShow baru dengan Halaman Obyek.

Di sini tidak perlu menulis Template Kelas baru untuk ini, Anda cukup menggunakan stdClass untuk membuat Kelas dengan cepat.

    $pageview=new PageShow($page);
    $pageview->show();
Mrinmoy Ghoshal
sumber
3
kelas kosong dengan fungsi bermanfaat yang bekerja dengan baris, juga merupakan standar pengkodean yang lebih baik
borrel
1
Itu akan sama dengan menggunakan array. Bahkan STDclass dihasilkan pada saat jenis juggling seperti konversi array ke objek.
varuog
1
Harap perbaiki salah ketik dalam kode Anda: ($ this-> currentpage-> name == 1) seharusnya ($ this-> currentpage-> status == 1)
Enriqe
7
"Anda dapat membuat kelas PHP anonim" - Ini bukan kelas anonim . Anda dapat menggunakan instanceof, get_class, ...
John Smith
2
Jawaban ini sangat membingungkan sekarang karena PHP sebenarnya memiliki kelas anonim , yang sangat berbeda stdClass.
IMSoP
59

Juga patut dicatat, sebuah stdClassobjek dapat dibuat dari penggunaannya json_decode()juga.

mdpatrick
sumber
5
Benar. Saya sering menggunakan json_encode dan json_decode untuk mengubah array ke objek ke array, bila perlu.
pinkal vansia
6
$ x = json_decode (json_encode ($ objek), True) akan mendekode objek menjadi array, tetapi ini bukan biner aman. Pada dasarnya jika itu bukan teks biasa itu mungkin rusak di JSON.
simontemplar
@simontemplar Di PHP Anda seharusnya tidak menulis True. Boolean adalah huruf kecil trueatau false.
BadHorsie
2
@simontemplar Manual ini tidak, tetapi PSR-2 melakukannya, jadi jika Anda mengikuti standar apa pun, itu harus dalam huruf kecil. Tentu, jika Anda ingin menulisnya seperti itu valid tetapi Anda harus mengikuti standar. Dokumentasi manual untuk boolean akan sangat lama, mungkin ditulis sebelum standar dibentuk. Jujur saja, PHP awalnya ditulis sebagai kekacauan lengkap tanpa standar apa pun (lihat berbagai konvensi penamaan variabel / fungsi / objek yang digunakan). Jujur saya tidak pernah melihat kode PHP di mana pengembang menggunakan format Anda.
BadHorsie
2
Saya memang mengikuti PSR-2 kecuali untuk True / False / Null dan meletakkan kawat gigi pembuka di jalur mereka sendiri untuk kelas. Selain itu, saya tidak peduli. Jika pernah mengedit kode orang lain, saya mengikuti standar apa pun yang mereka gunakan (jika ada, biasanya tidak ada) dan gagal yang saya lakukan, lakukan PSR-2 dengan cara yang "benar". Ada banyak kode yang mengerikan di luar sana dengan banyak masalah lain yang menggunakan huruf besar dari tiga kata kunci adalah yang paling sedikit dari kekhawatiran saya.
simontemplar
26

Menggunakan stdClass Anda dapat membuat objek baru dengan properti itu sendiri. Pertimbangkan contoh berikut yang mewakili detail pengguna sebagai array asosiatif.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "[email protected]";

Jika Anda perlu merepresentasikan detail yang sama dengan properti suatu objek, Anda bisa menggunakan stdClass seperti di bawah ini.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "[email protected]";

Jika Anda seorang pengembang Joomla, rujuk contoh ini di dokumen Joomla untuk pemahaman lebih lanjut.

Bandula Dharmadasa
sumber
24

Juga,

$myNewObj->setNewVar = 'newVal'; 

menghasilkan objek stdClass - otomatis dicor

Saya menemukan ini hari ini dengan salah mengeja:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

Keren!

Codename-Steeve-Knight
sumber
9
Tapi ini seharusnya menaikkan E_NOTICE
Petah
3
@ Petah Hanya di PHP 5.3+ kan? Tapi tentu saja itu adalah praktik buruk.
ChristoKiwi
15

stdClass bukan kelas anonim atau objek anonim

Jawaban di sini mencakup ekspresi yang stdClassmerupakan kelas anonim atau bahkan objek anonim. Itu tidak benar.

stdClasshanyalah kelas standar yang telah ditentukan sebelumnya. Anda dapat memeriksa ini menggunakan instanceofoperator atau fungsi get_class. Tidak ada yang istimewa di sini. PHP menggunakan kelas ini saat memberikan nilai lain ke objek.

Dalam banyak kasus di mana stdClassdigunakan oleh pemrogram array adalah pilihan yang lebih baik, karena fungsi yang berguna dan fakta bahwa usecase ini mewakili struktur data bukan objek nyata.

John Smith
sumber
8

Juga perlu dicatat bahwa dengan menggunakan Casting Anda sebenarnya tidak perlu membuat objek seperti pada jawaban yang diberikan oleh @Bandula. Alih-alih, Anda cukup melemparkan array ke objek dan stdClass dikembalikan. Sebagai contoh:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again

Antony
sumber
Suka. Jauh lebih bersih!
WebSpanner
7

Sebenarnya saya mencoba membuat stdClass kosong dan membandingkan kecepatan ke kelas kosong.

class emp{}

kemudian mulai membuat 1000 stdClasses dan emps ... kelas kosong dilakukan di sekitar 1.100 mikrodetik sementara stdClasses mengambil lebih dari 1.700 mikrodetik. Jadi saya kira lebih baik untuk membuat kelas boneka Anda sendiri untuk menyimpan data jika Anda ingin menggunakan objek untuk itu sangat buruk (array jauh lebih cepat baik untuk menulis maupun membaca).

Sage
sumber
22
rupanya perbedaan itu disebabkan oleh perbedaan panjang nama. jika Anda memanggil kelas "averylongclassnamefornoapparentreason", itu akan membutuhkan waktu lebih lama untuk dibuat. jadi pergilah.
Sage
27
Hmmm ... optimasi prematur. Saya lebih suka menemukan query SQL yang kompleks atau hambatan jaringan lainnya jika saya benar-benar peduli dengan kecepatan daripada menghabiskan waktu menghemat 600 mikrodetik. Sebenarnya, saya lebih suka memeriksa dulu apakah javascript ada di footer daripada di kepala daripada peduli apakah ada yang 600 mikrodetik lebih cepat dari yang lain.
Ardee Aram
6
1000 terlalu kecil untuk tolok ukur yang andal. Coba satu miliar.
buka kanan
1
Di dunia PHP, hampir selalu lebih baik menggunakan array.
Vahid Amiri
^ Jelas tidak begitu. Array hell adalah mimpi buruk ketika bekerja dalam sebuah tim di sebuah proyek besar.
Davie Dave
6

stdClass objek yang digunakan

StdClass memungkinkan Anda untuk membuat kelas anonim dan dengan casting objek Anda juga dapat mengakses kunci array asosiatif dalam gaya OOP. Sama seperti Anda akan mengakses properti objek biasa.

Contoh

class Example {

  private $options;

  public function __construct(Array $setup)
  {
    // casting Array to stdClass object
    $this->options = (object) $setup;

    // access stdClass object in oop style - here transform data in OOP style using some custom method or something...
    echo $this->options->{'name'}; // ->{'key'}
    echo $this->options->surname;  // ->key
  }

}

$ob1 = new Example(["name" => "John", "surname" => "Doe"]);

akan bergema

John Doe

DevWL
sumber
5

Jika Anda ingin dengan cepat membuat objek baru untuk menyimpan beberapa data tentang buku. Anda akan melakukan sesuatu seperti ini:

$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://www.amazon.com/dp/0439136369/";

Silakan periksa situs - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ untuk rincian lebih lanjut.

Niladri Banerjee - Uttarpara
sumber
4

Harap diingat bahwa 2 stdClasses kosong tidak sepenuhnya sama. Ini sangat penting ketika menulis harapan ejekan.

php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >
jakub wrona
sumber
Karena ini BUKAN contoh yang sama, ergo tidak bisa sama satu sama lain. Perbandingan kelas yang ketat bekerja dengan identifikasi instance. Setiap instance dari setiap kelas memiliki ID unik.
Bednic
3

Manual php.net memiliki beberapa penjelasan yang solid dan contoh yang dikontribusikan oleh pengguna tentang apa stdClass, saya terutama menyukai yang ini http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

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 Objek, Anda mendapatkan instance dari stdClass. Anda dapat menggunakan stdClass kapan pun Anda membutuhkan instance objek generik.

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.

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

Danijel
sumber
3

adalah cara di mana hindari berhenti menafsirkan skrip ketika ada beberapa data yang harus dimasukkan ke dalam kelas, tetapi sayangnya kelas ini tidak didefinisikan

Contoh:

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

Di sini data akan dimasukkan ke dalam 'Tugas' yang telah ditentukan. Tetapi, jika kita melakukan kode seperti ini:

 return $statement->fetchAll(PDO::FETCH_CLASS );

lalu akan memasukkan hasilnya .

secara sederhana mengatakan bahwa: lihat, kami memiliki KIDS yang baik [Objek] Di sini tetapi tanpa Orang Tua. Jadi, kami akan mengirim mereka ke Rumah Perawatan anak bayi :)

Nasir Nasrallah
sumber
2

Anda juga dapat menggunakan objectuntuk melemparkan array ke objek pilihan Anda:

Class Example
{
   public $name;
   public $age;
}

Sekarang untuk membuat objek tipe Exampledan menginisialisasi Anda dapat melakukan salah satu dari ini:

$example = new Example();
$example->name = "some name";
$example->age = 22;

ATAU

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

Metode kedua sebagian besar berguna untuk menginisialisasi objek dengan banyak properti.

Vahid Amiri
sumber
1

stClass adalah kelas kosong yang dibuat oleh php itu sendiri, dan harus digunakan oleh php saja, karena bukan hanya kelas "kosong", php menggunakan stdClass untuk mengonversi array ke gaya objek jika Anda perlu menggunakan stdClass, saya merekomendasikan dua opsi yang lebih baik : 1- gunakan array (jauh lebih cepat dari kelas) 2- membuat kelas kosong Anda sendiri dan menggunakannya

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

apa yang membuat seseorang berpikir tentang menggunakan gaya objek, bukan gaya array ???

Sherif Eldeeb
sumber
0

Alasan mengapa kita memiliki stdClass adalah karena dalam PHP tidak ada cara untuk membedakan array normal dari associate array (seperti dalam Javascript yang Anda miliki {}untuk objek dan []untuk array untuk membedakannya).

Jadi ini menciptakan masalah untuk objek kosong. Ambil contoh ini.

PHP:

$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Mari kita asumsikan Anda ingin menyandikan JSON variabel $ c

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

Sekarang katakanlah Anda menghapus semua kunci dari $bmembuatnya kosong. Karena $bsekarang kosong (Anda menghapus semua kunci ingat?), Sepertinya []yang dapat berupa array atau objek jika Anda melihatnya.

Jadi jika Anda melakukan json_encode lagi, hasilnya akan berbeda

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

Ini adalah masalah karena kita tahu bbahwa seharusnya menjadi associate array tetapi PHP (atau fungsi apa pun seperti json_encode) tidak.

Jadi stdClass datang untuk menyelamatkan. Ambil contoh yang sama lagi

$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Jadi sekarang bahkan jika Anda menghapus semua kunci dari $bdan membuatnya kosong, karena ini adalah stdClass itu tidak masalah dan ketika Anda json_encode Anda akan mendapatkan ini:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

Ini juga alasan mengapa json_encodedan json_decodesecara default mengembalikan stdClass.

 $c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
 // $c is now ['a' => [1,2,3], 'b' => []] in PHP
 // if you json_encode($c) again your data is now corrupted
supersan
sumber