PHP'de stdClass nedir?


Yanıtlar:


785

stdClassPHP'nin genel boş sınıfıdır, ObjectJava veya objectPython'da olduğu gibidir ( Düzenleme: aslında evrensel temel sınıf olarak kullanılmaz; bunu işaret ettiğiniz için teşekkürler @Ciaran ).

Anonim nesneler, dinamik özellikler vb. İçin kullanışlıdır.

StdClass'ı dikkate almanın kolay bir yolu ilişkilendirilebilir diziye bir alternatiftir. json_decode()StdClass örneğinin veya ilişkilendirilebilir bir dizinin alınmasına nasıl izin verildiğini gösteren aşağıdaki bu örneğe bakın . Ayrıca, ancak bu örnekte gösterilmiyorsa, SoapClient::__soapCallbir StdClass örneği döndürür.

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

Daha fazla örnek için PHP ve StdClass'ta Dinamik Özellikler konusuna bakın .


7
belki mysql_fetch_object kullandı. im yanlış değilse stdlcass örneği oluşturur.
Galen

69
Java'nın Object'i gibi temel bir sınıf değil, aşağıdaki cevabımı görün.
Ciaran McNulty

1
Umarım nesnenin Python'daki "tüm" nesnelerin türetilmiş sınıfı olmadığını bilirsiniz ... En azından, Python 3.0'daki nesneden türetmek zorunda kalana kadar değil
monokrome

11
Bence insanlar stdClass'ın JavaScript'in {}yapısı gibi bir şey olduğunu söylemeliler .
Dünya Motoru

Efendim, makaleniz yanlış olduğundan cevabınız kısmen yanlış. Bu sınıfı genişletmek size verir tek (ve bu da yanlış) şey ipucu yazma seçeneği yani function(StdClass $a, array $params)vs $anesne olup olmadığını kontrol seçeneği instanceof.
Dejan Marjanovic

1114

stdClassyalnızca diğer türleri nesnelere dönüştürürken kullanılan genel bir 'boş' sınıftır. Diğer iki cevaplar söylediklerine rağmen, stdClassolduğu değil PHP'de nesneler için taban sınıf. Bu oldukça kolay bir şekilde gösterilebilir:

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

PHP bir temel nesne kavramı olduğuna inanmıyorum


4
std ne anlama geliyor?
Adam Waite

47
std = standart -
Tomas Prado

1
Bu bir yardımcı sınıf! BTW bu gerçek yorum!
Gustav

16
Aslında, kod pasajından sonraki ilk cümle soruyu cevaplar.
MauganRa

2
@Miro Markaravanes: Dinamik özellikler sadece stdClass'a değil, PHP'deki herhangi bir sınıfa atanabilir.
StanE

95

stdClass başka bir harika PHP özelliğidir. Anonim bir PHP sınıfı oluşturabilirsiniz. Bir örnek kontrol edelim.

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

şimdi bir sayfa nesnesiyle başlatılacak ve üzerinde temel yürütecek başka bir sınıfınız olduğunu düşünün.

<?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';
    }
}

Şimdi bir Sayfa Nesnesi ile yeni bir PageShow nesnesi oluşturmanız gerekir.

Burada bunun için yeni bir Sınıf Şablonu yazmaya gerek yok, stdClass'ı anında bir Sınıf oluşturmak için kullanabilirsiniz.

    $pageview=new PageShow($page);
    $pageview->show();

3
satırlarla çalışan kullanışlı işlevlere sahip boş bir sınıf, aynı zamanda daha iyi bir kodlama standardı
13:47

1
Dizi kullanmakla aynı olurdu. Aslında STDclass, diziden nesneye dönüşüm gibi tip dönüşümü sırasında üretilir.
varuog

1
Lütfen kodunuzdaki bir yazım hatasını düzeltin: ($ this-> currentpage-> name == 1) ($ this-> currentpage-> status == 1) olmalıdır
Enriqe

7
"Anonim bir PHP sınıfı oluşturabilirsiniz" - Bu anonim bir sınıf değildir . İnstanceof, get_class, ... kullanabilirsiniz
John Smith

2
Bu cevap, özellikle şimdi kafa karıştırıcı PHP aslında anonim sınıfları vardır çok farklıdır, stdClass.
IMSoP

59

Ayrıca, bir stdClassnesne, kullanımından da oluşturulabilir json_decode().


5
Doğru. Gerektiğinde diziyi nesneye diziye dönüştürmek için sık sık json_encode ve json_decode kullanıyorum.
pinkal vansia

6
$ x = json_decode (json_encode ($ object), True) nesneyi bir diziye deşifre eder, ancak ikili güvenli değildir. Temelde düz metin değilse JSON'da kırılabilir.
simontemplar

@simontemplar PHP'de yazmamalısınız True. Booleans küçük harfli trueveya false.
BadHorsie

2
@simontemplar Kılavuz değil, PSR-2 kullanıyor , bu nedenle herhangi bir standardı takip ediyorsanız küçük harflerle yazılmalıdır. Elbette, bu şekilde yazmak istiyorsanız, geçerli ancak standartları izlemelisiniz. Booleans için manuel dokümantasyon, muhtemelen standartlar oluşturulmadan önce yazılmış, çok eski olacaktır. Dürüst olalım, PHP başlangıçta herhangi bir standart olmaksızın tam bir karmaşa olarak yazılmıştır (kullanılan değişken / işlev / nesne adlandırma kurallarının geniş yelpazesine bakın). Dürüst olmak gerekirse geliştirici biçiminizi kullandığı herhangi bir PHP kodu görmedim.
BadHorsie

2
PSR-2'yi True / False / Null dışında ve sınıflar için kendi satırlarına açılış ayraçları koyarak izlerim. Bunun dışında umrumda değil. Yine de başka birinin kodunu düzenlerseniz, kullandıkları standardı (varsa, genellikle hiçbiri) izlerim ve başarısız olursam, PSR-2'yi "doğru" şekilde yapın. Üç anahtar kelime büyük harfle benim endişelerim en az tonlarca başka sorunları ile orada tanrı korkunç kod bol var.
simontemplar

26

StdClass kullanarak kendi özelliklerine sahip yeni bir nesne oluşturabilirsiniz. Kullanıcının ilişkilendirilebilir dizi olarak ayrıntılarını temsil eden aşağıdaki örneği düşünün.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

Bir nesnenin özellikleriyle aynı ayrıntıları temsil etmeniz gerekiyorsa stdClass'ı aşağıdaki gibi kullanabilirsiniz .

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

Joomla geliştiricisiyseniz , daha fazla bilgi için Joomla belgelerinde bu örneğe bakın .


24

Aynı şekilde,

$myNewObj->setNewVar = 'newVal'; 

stdClass nesnesi verir - otomatik döküm

Bunu bugün yazım hatasıyla öğrendim:

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

Güzel!


9
Ama bu bir E_NOTICE yükseltmeli
Petah

3
@Petah Sadece PHP 5.3+ sürümünde değil mi? Ama evet, bu kötü bir uygulamadır.
ChristoKiwi

15

stdClass anonim bir sınıf veya anonim bir nesne değildir

Buradaki yanıtlar stdClass, anonim bir sınıf veya hatta anonim bir nesne olan ifadeleri içerir . Bu doğru değil.

stdClasssadece düzenli olarak tanımlanmış bir sınıftır. Bunu instanceofoperatör veya işlev kullanarak kontrol edebilirsiniz get_class. Burada özel bir şey yok. PHP bu sınıfı nesneye başka değerler verirken kullanır.

stdClassProgramcılar tarafından kullanılan birçok durumda , dizi yararlı işlevler ve bu kullanıcı tabanının gerçek bir nesneyi değil veri yapısını temsil ettiği için daha iyi bir seçenektir.


8

Ayrıca, Döküm kullanarak @Bandula tarafından verilen cevapta olduğu gibi bir nesne oluşturmanız gerekmediğini de belirtmek gerekir. Bunun yerine dizinizi bir nesneye atabilirsiniz ve stdClass döndürülür. Örneğin:

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

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

Output: again


Sevdim. Çok daha temiz!
WebSpanner

7

Aslında boş stdClass oluşturmayı denedim ve hızı boş sınıfa karşılaştırdım.

class emp{}

daha sonra 1000 stdClasses ve emps oluşturmaya devam etti ... 1100 mikrosaniyede boş sınıflar yapılırken stdClasses 1700 mikrosaniyeyi aştı. Bu yüzden nesneleri bu kadar kötü kullanmak istiyorsanız, veri depolamak için kendi kukla sınıfınızı oluşturmak daha iyidir (diziler hem yazma hem de okuma için çok daha hızlıdır).


22
Görünüşe göre fark, isim uzunluğundaki farktan kaynaklanıyor. "averylongclassnamefornoapparentreason" adını verirseniz, oluşturulması çok daha uzun sürer. bu yüzden şekil gidin.
Sage

27
Hmmm ... erken optimizasyon. Gerçekten 600 mikrosaniye tasarruf zaman harcamak yerine hız ile ilgileniyorsanız karmaşık SQL sorguları veya diğer ağ darboğazları bulmak istiyorum. Aslında, önce javascript'in altbilgi yerine altbilgide olup olmadığını kontrol etmeyi tercih ederim.
Mart'ta Ardee Aram

6
1000 güvenilir bir kıyaslama için çok küçük. Bir milyar deneyin.
rightfold

1
PHP dünyasında dizileri kullanmak neredeyse her zaman daha iyidir.
Vahid Amiri

^ Kesinlikle öyle değil. Dizi cehennemi, büyük bir projede bir ekipte çalışırken bir kabus.
Davie Dave

6

kullanımdaki stdClass nesneleri

StdClass, anonim sınıflar oluşturmanıza izin verir ve nesne dökümüyle OOP stilinde ilişkilendirilebilir bir dizinin anahtarlarına da erişebilirsiniz. Tıpkı normal nesne özelliğine erişeceğiniz gibi.

Misal

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"]);

yankılanacak

John Doe


5

Bir kitapla ilgili bazı verileri tutmak için hızlı bir şekilde yeni bir nesne oluşturmak istiyorsanız. Böyle bir şey yapardınız:

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

Daha fazla bilgi için lütfen http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ sitesini ziyaret edin .


4

Lütfen 2 boş stdClasses'ın kesinlikle eşit olmadığını unutmayın. Alay beklentileri yazarken bu çok önemlidir.

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 >

Aynı örnek DEĞİLDİR, ergo birbirine eşit olamaz. Sınıfların katı karşılaştırması, örnek tanımlama ile çalışır. Herhangi bir sınıfın her örneğinin benzersiz kimliği vardır.
Bednic

3

php.net manuel stdClass ne kullanıcılar tarafından katkıda katı bir açıklama ve örnekler vardır, ben özellikle bu bir http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

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.

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.

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


3

bir yoludur bir sınıfa bazı veriler konulması gerektiğinde betiği yorumlamayı bırakmaktan kaçının, ama ne yazık ki bu sınıf tanımlanmadı

Misal :

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

Burada veriler önceden tanımlanmış 'Görevler'e konacaktır. Ancak, kodu şu şekilde yaparsak:

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

sonra sonuçları koyacağız .

basitçe diyor ki: bak, burada iyi bir ÇOCUK var [Objeler] Ama Ebeveynler olmadan. Bu yüzden, onları bir bebek çocuk Bakım Evi'ne göndereceğiz :)


2

objectDizileri istediğiniz bir nesneye yayınlamak için de kullanabilirsiniz :

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

Şimdi bir tür nesne oluşturmak Exampleve onu başlatmak için aşağıdakilerden birini yapabilirsiniz:

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

VEYA

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

İkinci yöntem çoğunlukla birçok özelliğe sahip nesneleri başlatmak için kullanışlıdır.


1

stClass php kendisi tarafından oluşturulan boş bir sınıftır ve sadece php tarafından kullanılmalıdır, çünkü sadece bir "boş" sınıf değil, php stdClass kullanmanız gerekiyorsa dizileri nesne stiline dönüştürmek için stdClass kullanır, iki daha iyi seçenek öneririm : 1- Dizileri kullanın (sınıflardan çok daha hızlı) 2- Kendi boş sınıfınızı yapın ve kullanın

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

dizi tarzı yerine nesne stilini kullanarak düşünmek için ne yapar ???


0

StdClass'a sahip olmamızın nedeni, PHP'de normal bir diziyi ilişkilendirilmiş bir diziden ayırmanın bir yolu olmamasıdır (Javascript'te olduğu gibi {}nesne ve []dizinin onları ayırt etmesi için).

Böylece bu boş nesneler için bir sorun yaratır. Örneğin bunu ele alalım.

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)

Diyelim ki JSON $ c değişkenini kodlamak istiyorsunuz

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

Şimdi diyelim ki tüm anahtarları $bboş bırakmaktan sildiniz . Yana $bartık boş olduğunu benzediğini (Anahtarlar hatırlar hepsi? Silinmiş) []ona bak eğer ki bir dizi veya nesne olabilir.

Yani tekrar json_encode yaparsanız, çıktı farklı olacaktır

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

Bu bir sorundur, çünkü bunun bortak bir dizi olması gerekiyordu, ancak PHP (veya json_encode gibi herhangi bir işlev) olmadığını biliyoruz .

Böylece stdClass kurtarmaya geliyor. Aynı örneği tekrar almak

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

Bu yüzden şimdi tüm anahtarları silseniz $bve boş bıraksanız bile, bir stdClass olduğundan, önemli olmayacak ve json_encode yaptığınızda bunu alacaksınız:

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

Bu aynı zamanda json_encodeve json_decodevarsayılan olarak stdClass'ı döndürme nedenidir .

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