โปรดระบุว่าอะไรstdClass
คือ
โปรดระบุว่าอะไรstdClass
คือ
คำตอบ:
stdClass
เป็นคลาสว่างเปล่าทั่วไปของ PHP ชนิดที่คล้ายกันObject
ใน Java หรือobject
Python ( แก้ไข:แต่ไม่ได้ใช้เป็นคลาสพื้นฐานสากลจริงๆขอบคุณ@Ciaran สำหรับการ ชี้เรื่องนี้ )
มันมีประโยชน์สำหรับวัตถุที่ไม่ระบุชื่อคุณสมบัติแบบไดนามิก ฯลฯ
วิธีง่ายๆในการพิจารณา StdClass เป็นทางเลือกสำหรับอาเรย์แบบเชื่อมโยง ดูตัวอย่างด้านล่างที่แสดงวิธีการjson_decode()
อนุญาตให้รับอินสแตนซ์ StdClass หรืออาเรย์แบบเชื่อมโยง นอกจากนี้ แต่ไม่แสดงในตัวอย่างนี้SoapClient::__soapCall
ส่งคืนอินสแตนซ์ 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
ดูคุณสมบัติแบบไดนามิกใน PHP และ StdClassสำหรับตัวอย่างเพิ่มเติม
{}
โครงสร้างของ JavaScript
function(StdClass $a, array $params)
vs การตรวจสอบว่า$a
เป็นวัตถุหรือinstanceof
ไม่
stdClass
เป็นเพียงคลาส 'ว่างเปล่า' ทั่วไปที่ใช้เมื่อทำการคัดเลือกวัตถุประเภทอื่น แม้จะมีสิ่งอื่น ๆ ที่สองคำตอบที่บอกว่าstdClass
เป็นไม่ได้ชั้นฐานสำหรับวัตถุใน PHP สิ่งนี้สามารถแสดงให้เห็นได้อย่างง่ายดาย:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
ฉันไม่เชื่อว่ามีแนวคิดของวัตถุฐานใน PHP
stdClass เป็นอีกหนึ่งฟีเจอร์ PHP ที่ยอดเยี่ยม คุณสามารถสร้างคลาส PHP แบบไม่ระบุชื่อ ให้ตรวจสอบตัวอย่าง
$page=new stdClass();
$page->name='Home';
$page->status=1;
ตอนนี้คิดว่าคุณมีคลาสอื่นที่จะเริ่มต้นด้วยวัตถุหน้าและดำเนินการกับมัน
<?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';
}
}
ตอนนี้คุณต้องสร้างวัตถุ PageShow ใหม่ด้วย Page Object
ที่นี่ไม่จำเป็นต้องเขียนเทมเพลตคลาสใหม่สำหรับสิ่งนี้คุณสามารถใช้ stdClass เพื่อสร้างคลาสได้ทันที
$pageview=new PageShow($page);
$pageview->show();
stdClass
ซึ่งมีความแตกต่างจาก
นอกจากนี้ยังมีข้อสังเกตว่าstdClass
สามารถสร้างวัตถุจากการใช้งานได้json_decode()
เช่นกัน
True
คุณไม่ควรเขียน booleans เป็นกรณีที่ต่ำกว่าหรือtrue
false
การใช้stdClassคุณสามารถสร้างวัตถุใหม่ด้วยคุณสมบัติของมันเอง พิจารณาตัวอย่างต่อไปนี้ที่แสดงรายละเอียดของผู้ใช้เป็นอาร์เรย์ที่เชื่อมโยง
$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
หากคุณต้องการแสดงรายละเอียดเช่นเดียวกับคุณสมบัติของวัตถุคุณสามารถใช้stdClassดังต่อไปนี้
$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
หากคุณเป็นนักพัฒนา Joomla ให้อ้างอิงตัวอย่างนี้ในเอกสาร Joomlaเพื่อความเข้าใจเพิ่มเติม
ในทำนองเดียวกัน
$myNewObj->setNewVar = 'newVal';
ให้ผลเป็นวัตถุ stdClass - casted อัตโนมัติ
ฉันพบสิ่งนี้ในวันนี้โดยการสะกดคำผิด:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
เย็น!
คำตอบที่นี่มีนิพจน์ที่stdClass
เป็นคลาสที่ไม่ระบุชื่อหรือแม้แต่วัตถุที่ไม่ระบุชื่อ มันไม่จริง
stdClass
เป็นเพียงคลาสที่กำหนดไว้ล่วงหน้าตามปกติ คุณสามารถตรวจสอบการใช้ประกอบการหรือฟังก์ชั่นinstanceof
get_class
ไม่มีอะไรพิเศษไปที่นี่ PHP ใช้คลาสนี้เมื่อทำการหล่อค่าอื่น ๆ เพื่อคัดค้าน
ในหลาย ๆ กรณีที่stdClass
โปรแกรมเมอร์ใช้อาร์เรย์ตัวเลือกที่ดีกว่าเนื่องจากฟังก์ชั่นที่มีประโยชน์และความจริงที่ว่า usecase นี้แสดงถึงโครงสร้างข้อมูลไม่ใช่วัตถุจริง
นอกจากนี้ยังเป็นที่น่าสังเกตว่าการใช้การหล่อคุณไม่จำเป็นต้องสร้างวัตถุตามคำตอบของ @Bandula แต่คุณสามารถส่งอาร์เรย์ไปยังวัตถุและ stdClass ถูกส่งคืน ตัวอย่างเช่น:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
ที่จริงฉันพยายามสร้าง stdClass ที่ว่างเปล่าและเปรียบเทียบความเร็วกับคลาสที่ว่างเปล่า
class emp{}
จากนั้นดำเนินการสร้าง 1,000 stdClasses และ emps ต่อไป ... คลาสที่ว่างเปล่าเสร็จใน 1100 microseconds ในขณะที่ stdClasses ใช้เวลามากกว่า 1,700 microseconds ดังนั้นฉันจึงคิดว่ามันจะดีกว่าที่จะสร้างคลาสหุ่นของคุณเองสำหรับการจัดเก็บข้อมูลถ้าคุณต้องการใช้วัตถุเพื่อที่ไม่ดี (อาร์เรย์จะเร็วกว่ามากสำหรับทั้งการเขียนและการอ่าน)
stdClass ช่วยให้คุณสร้างคลาสที่ไม่ระบุชื่อและด้วยการคัดเลือกวัตถุคุณยังสามารถเข้าถึงคีย์ของอาเรย์แบบเชื่อมโยงในสไตล์ OOP เช่นเดียวกับที่คุณเข้าถึงคุณสมบัติของวัตถุปกติ
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"]);
จะสะท้อน
จอห์นโด
หากคุณต้องการสร้างวัตถุใหม่อย่างรวดเร็วเพื่อเก็บข้อมูลบางอย่างเกี่ยวกับหนังสือ คุณจะทำสิ่งนี้:
$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/";
กรุณาตรวจสอบเว็บไซต์ - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/สำหรับรายละเอียดเพิ่มเติม
โปรดจำไว้ว่า stdClasses ที่ว่างเปล่า 2 อันไม่เท่ากันอย่างเคร่งครัด สิ่งนี้สำคัญมากเมื่อเขียนความคาดหวังของการเยาะเย้ย
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 มีคำอธิบายที่ชัดเจนและตัวอย่างที่ผู้ใช้ stdClass ให้ฉันฉันชอบอย่างนี้http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773
stdClass เป็นวัตถุ PHP เริ่มต้น stdClass ไม่มีคุณสมบัติวิธีการหรือผู้ปกครอง มันไม่รองรับวิธีการเวทย์มนตร์และไม่มีส่วนต่อประสาน
เมื่อคุณส่งสเกลาร์หรืออาร์เรย์เป็นวัตถุคุณจะได้รับอินสแตนซ์ของ stdClass คุณสามารถใช้ stdClass ทุกครั้งที่คุณต้องการอินสแตนซ์ของวัตถุทั่วไป
stdClass ไม่ใช่คลาสพื้นฐาน! คลาส PHP ไม่ได้รับมรดกโดยอัตโนมัติจากคลาสใด ๆ คลาสทั้งหมดเป็นแบบสแตนด์อโลนยกเว้นว่าจะขยายคลาสอื่นอย่างชัดเจน PHP แตกต่างจากภาษาเชิงวัตถุจำนวนมากในส่วนนี้
คุณสามารถกำหนดคลาสที่ขยาย stdClass แต่คุณจะไม่ได้รับประโยชน์เนื่องจาก stdClass ไม่ทำอะไรเลย
stdclass เป็นวิธีการที่ PHP หลีกเลี่ยงการหยุดการตีความสคริปต์เมื่อมีข้อมูลบางอย่างจะต้องใส่ในชั้นเรียน แต่น่าเสียดายที่ชั้นนี้ไม่ได้กำหนดไว้
ตัวอย่าง:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
ข้อมูลจะถูกใส่ไว้ใน 'งาน' ที่กำหนดไว้ล่วงหน้า แต่ถ้าเราทำรหัสตามนี้:
return $statement->fetchAll(PDO::FETCH_CLASS );
จากนั้น PHP จะใส่ผลลัพธ์ใน stdclass .
ง่ายดาย PHPบอกว่า: ดูสิเรามี KIDS ที่ดี [วัตถุ] ที่นี่ แต่ไม่มีพ่อแม่ ดังนั้นเราจะส่งพวกเขาไปที่ศูนย์ดูแลเด็กทารกstdclass :)
คุณยังสามารถใช้object
เพื่อส่งอาร์เรย์ไปยังวัตถุที่คุณเลือกได้:
Class Example
{
public $name;
public $age;
}
ตอนนี้เพื่อสร้างออบเจ็กต์ประเภทExample
และเริ่มต้นคุณสามารถทำสิ่งใดสิ่งหนึ่งต่อไปนี้:
$example = new Example();
$example->name = "some name";
$example->age = 22;
หรือ
$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];
วิธีที่สองส่วนใหญ่มีประโยชน์สำหรับการเริ่มต้นวัตถุด้วยคุณสมบัติมากมาย
stClass เป็นคลาสที่ว่างเปล่าที่สร้างโดย php เองและควรใช้โดย php เท่านั้นเนื่องจากไม่ใช่คลาส "ที่ว่างเปล่า" php ใช้ stdClass เพื่อแปลงอาร์เรย์เป็นสไตล์วัตถุถ้าคุณต้องการใช้ stdClass ฉันแนะนำสองตัวเลือกที่ดีกว่า : 1- ใช้อาร์เรย์ (เร็วกว่าคลาส) 2- ทำคลาสว่างของคุณเองและใช้มัน
//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';
อะไรที่ทำให้คนคิดเกี่ยวกับการใช้รูปแบบวัตถุแทนที่จะเป็นรูปแบบอาร์เรย์
เหตุผลที่เรามีstdClassเป็นเพราะใน PHP ไม่มีวิธีแยกอาเรย์ปกติจากอาเรย์ที่สัมพันธ์กัน (เช่นใน Javascript ที่คุณมี{}
สำหรับออบเจ็กต์และ[]
อาเรย์เพื่อแยกความแตกต่าง)
ดังนั้นสิ่งนี้จึงสร้างปัญหาสำหรับวัตถุที่ว่างเปล่า ยกตัวอย่างเช่น
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)
สมมติว่าคุณต้องการ JSON เข้ารหัสตัวแปร $ c
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}
ตอนนี้สมมติว่าคุณลบคีย์ทั้งหมดจาก$b
การทำให้ว่างเปล่า เนื่องจาก$b
ตอนนี้ว่างเปล่า (คุณลบคีย์ทั้งหมดที่จำได้หรือไม่) ดูเหมือนว่า[]
จะเป็นอาเรย์หรือวัตถุถ้าคุณดู
ดังนั้นถ้าคุณทำ json_encode อีกครั้งผลลัพธ์จะแตกต่างกัน
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}
นี่เป็นปัญหาเพราะเรารู้b
ว่ามันควรจะเป็นอาเรย์ที่สัมพันธ์กัน แต่ PHP (หรือฟังก์ชั่นใด ๆ เช่น json_encode) ไม่ได้
ดังนั้น stdClass มาช่วยเหลือ ยกตัวอย่างเดียวกันอีกครั้ง
$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)
ดังนั้นแม้ว่าคุณจะลบกุญแจทั้งหมด$b
และทำให้มันว่างเปล่าเพราะมันเป็น stdClass มันจะไม่สำคัญและเมื่อคุณ json_encode คุณจะได้สิ่งนี้:
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
นี่คือเหตุผลที่json_encode
และjson_decode
โดยดีฟอลต์ 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