Lütfen ne stdClass
olduğunu tanımlayın .
Lütfen ne stdClass
olduğunu tanımlayın .
Yanıtlar:
stdClass
PHP'nin genel boş sınıfıdır, Object
Java veya object
Python'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::__soapCall
bir 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 .
{}
yapısı gibi bir şey olduğunu söylemeliler .
function(StdClass $a, array $params)
vs $a
nesne olup olmadığını kontrol seçeneği instanceof
.
stdClass
yalnı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, stdClass
olduğ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
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();
stdClass
.
Ayrıca, bir stdClass
nesne, kullanımından da oluşturulabilir json_decode()
.
True
. Booleans küçük harfli true
veya false
.
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 .
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!
Buradaki yanıtlar stdClass
, anonim bir sınıf veya hatta anonim bir nesne olan ifadeleri içerir . Bu doğru değil.
stdClass
sadece düzenli olarak tanımlanmış bir sınıftır. Bunu instanceof
operatö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.
stdClass
Programcı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.
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
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).
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.
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
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 .
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 >
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.
stdClass bir yoludur php 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 php sonuçları koyacağız stdClass .
basitçe phpdiyor ki: bak, burada iyi bir ÇOCUK var [Objeler] Ama Ebeveynler olmadan. Bu yüzden, onları bir bebek çocuk Bakım Evi'ne göndereceğizstdClass :)
object
Dizileri istediğiniz bir nesneye yayınlamak için de kullanabilirsiniz :
Class Example
{
public $name;
public $age;
}
Şimdi bir tür nesne oluşturmak Example
ve 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.
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 ???
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ı $b
boş bırakmaktan sildiniz . Yana $b
artı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 b
ortak 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 $b
ve 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_encode
ve json_decode
varsayı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