stdClass ใน PHP คืออะไร?


คำตอบ:


785

stdClassเป็นคลาสว่างเปล่าทั่วไปของ PHP ชนิดที่คล้ายกันObjectใน Java หรือobjectPython ( แก้ไข:แต่ไม่ได้ใช้เป็นคลาสพื้นฐานสากลจริงๆขอบคุณ@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สำหรับตัวอย่างเพิ่มเติม


7
บางทีเขาอาจใช้ mysql_fetch_object ที่สร้างอินสแตนซ์ของ stdlcass ถ้าฉันไม่เข้าใจผิด
Galen

69
มันไม่ได้เป็นชั้นฐานในลักษณะที่วัตถุของ Java ดูคำตอบของฉันด้านล่าง
Ciaran McNulty

1
ฉันหวังว่าคุณจะรู้ว่าวัตถุไม่ใช่คลาสที่ได้รับมาของวัตถุ "ทั้งหมด" ใน Python ... อย่างน้อยก็ไม่ได้จนกว่าคุณจะถูกบังคับให้ต้องมาจากวัตถุใน Python 3.0
monokrome

11
ฉันคิดว่าผู้คนควรบอกว่า stdClass เป็นเหมือน{}โครงสร้างของ JavaScript
Earth Engine

ที่รักคำตอบของคุณไม่ถูกต้องเพียงบางส่วนเพราะบทความไม่ถูกต้อง สิ่งเดียว (และนี่ก็ผิดด้วย) สิ่งที่ขยายคลาสนี้ให้คุณคือตัวเลือกในการพิมพ์คำใบ้นั่นคือfunction(StdClass $a, array $params)vs การตรวจสอบว่า$aเป็นวัตถุหรือinstanceofไม่
Dejan Marjanovic

1114

stdClassเป็นเพียงคลาส 'ว่างเปล่า' ทั่วไปที่ใช้เมื่อทำการคัดเลือกวัตถุประเภทอื่น แม้จะมีสิ่งอื่น ๆ ที่สองคำตอบที่บอกว่าstdClassเป็นไม่ได้ชั้นฐานสำหรับวัตถุใน PHP สิ่งนี้สามารถแสดงให้เห็นได้อย่างง่ายดาย:

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

ฉันไม่เชื่อว่ามีแนวคิดของวัตถุฐานใน PHP


4
std หมายถึงอะไร
Adam Waite

47
std = standard -
Tomas Prado

1
มันเป็นคลาสยูทิลิตี้! Btw นี่คือความคิดเห็นที่แท้จริง!
กุสตาฟ

16
จริงๆแล้วประโยคแรกหลังจากตัวอย่างโค้ดตอบคำถาม
MauganRa

2
@Miro Markaravanes: แอตทริบิวต์แบบไดนามิกสามารถกำหนดให้กับคลาสใดก็ได้ใน PHP ไม่ใช่แค่ stdClass
StanE

95

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();

3
คลาสที่ว่างเปล่าที่มีฟังก์ชั่นที่มีประโยชน์ที่ใช้งานได้กับแถวและยังเป็นมาตรฐานในการเขียนโค้ดที่ดีขึ้นอีกด้วย
borrel

1
มันจะเหมือนกับการใช้อาร์เรย์ ในความเป็นจริง STDclass ถูกสร้างขึ้นในช่วงเวลาของการเล่นกลประเภทเช่นอาร์เรย์เพื่อการแปลงวัตถุ
varuog

1
โปรดแก้ไขการพิมพ์ผิดในรหัสของคุณ: ($ this-> currentpage-> name == 1) ควรเป็น ($ this-> currentpage-> status == 1)
Enriqe

7
"คุณสามารถสร้างชั้นที่ไม่ระบุชื่อ PHP" - มันไม่ได้เป็นระดับที่ไม่ระบุชื่อ คุณสามารถใช้ instanceof, get_class, ...
John Smith

2
คำตอบนี้โดยเฉพาะอย่างยิ่งทำให้เกิดความสับสนในขณะนี้ว่าPHP จริงมีชั้นเรียนที่ไม่ระบุชื่อstdClassซึ่งมีความแตกต่างจาก
IMSoP

59

นอกจากนี้ยังมีข้อสังเกตว่าstdClassสามารถสร้างวัตถุจากการใช้งานได้json_decode()เช่นกัน


5
จริง ฉันมักจะใช้ json_encode และ json_decode เพื่อแปลง array เป็น object เป็น array เมื่อจำเป็น
สีชมพู vansia

6
$ x = json_decode (json_encode ($ object), True) จะถอดรหัสวัตถุเป็นอาร์เรย์ แต่มันไม่ได้ปลอดภัยแบบไบนารี เป็นหลักหากไม่ได้เป็นธรรมดามันอาจแตกใน JSON
simontemplar

@simontemplar ใน PHP Trueคุณไม่ควรเขียน booleans เป็นกรณีที่ต่ำกว่าหรือtrue false
BadHorsie

2
@simontemplar คู่มือไม่ได้ แต่PSR-2ทำดังนั้นถ้าคุณทำตามมาตรฐานประเภทใด ๆ มันควรจะเป็นตัวพิมพ์เล็ก แน่นอนว่าถ้าคุณต้องการที่จะเขียนมันอย่างถูกต้องแต่คุณควรจะปฏิบัติตามมาตรฐาน เอกสารคู่มือสำหรับ booleans จะเก่ามากอาจเขียนก่อนที่มาตรฐานจะเกิดขึ้น มาเถอะ PHP ถูกเขียนขึ้นเป็นระเบียบสมบูรณ์โดยไม่ต้องมีมาตรฐานใด ๆ (ดูที่หลากหลายของอนุสัญญาตัวแปร / ฟังก์ชั่น / วัตถุที่ใช้) ฉันไม่เคยเห็นรหัส PHP ใด ๆ ที่ผู้พัฒนาใช้รูปแบบของคุณ
BadHorsie

2
ฉันทำตาม PSR-2 ยกเว้น True / False / Null และใส่เครื่องหมายปีกกาเปิดในบรรทัดของตนเองสำหรับคลาส นอกจากนั้นฉันแค่ไม่สนใจ แม้ว่าหากแก้ไขโค้ดของคนอื่นฉันก็จะทำตามมาตรฐานที่ใช้ (ถ้ามีมักจะไม่มี) และล้มเหลวที่ฉันทำให้ทำ PSR-2 ในแบบ "ถูกต้อง" มีโค้ดมากมายเหลือเกินจากพระเจ้าพร้อมกับปัญหาอื่น ๆ มากมายที่การใช้ตัวพิมพ์ใหญ่สำหรับคำหลักสามคำเป็นสิ่งที่ฉันกังวลน้อยที่สุด
simontemplar

26

การใช้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เพื่อความเข้าใจเพิ่มเติม


24

ในทำนองเดียวกัน

$myNewObj->setNewVar = 'newVal'; 

ให้ผลเป็นวัตถุ stdClass - casted อัตโนมัติ

ฉันพบสิ่งนี้ในวันนี้โดยการสะกดคำผิด:

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

เย็น!


9
แต่สิ่งนี้ควรเพิ่ม E_NOTICE
Petah

3
@Petah เฉพาะใน PHP 5.3+ ใช่ไหม? แต่ใช่มันเป็นการปฏิบัติที่ไม่ดีอย่างแน่นอน
ChristoKiwi

15

stdClass ไม่ใช่คลาสที่ไม่ระบุชื่อหรือวัตถุที่ไม่ระบุชื่อ

คำตอบที่นี่มีนิพจน์ที่stdClassเป็นคลาสที่ไม่ระบุชื่อหรือแม้แต่วัตถุที่ไม่ระบุชื่อ มันไม่จริง

stdClassเป็นเพียงคลาสที่กำหนดไว้ล่วงหน้าตามปกติ คุณสามารถตรวจสอบการใช้ประกอบการหรือฟังก์ชั่นinstanceof get_classไม่มีอะไรพิเศษไปที่นี่ PHP ใช้คลาสนี้เมื่อทำการหล่อค่าอื่น ๆ เพื่อคัดค้าน

ในหลาย ๆ กรณีที่stdClassโปรแกรมเมอร์ใช้อาร์เรย์ตัวเลือกที่ดีกว่าเนื่องจากฟังก์ชั่นที่มีประโยชน์และความจริงที่ว่า usecase นี้แสดงถึงโครงสร้างข้อมูลไม่ใช่วัตถุจริง


8

นอกจากนี้ยังเป็นที่น่าสังเกตว่าการใช้การหล่อคุณไม่จำเป็นต้องสร้างวัตถุตามคำตอบของ @Bandula แต่คุณสามารถส่งอาร์เรย์ไปยังวัตถุและ stdClass ถูกส่งคืน ตัวอย่างเช่น:

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

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

Output: again


รักมัน ทำความสะอาดมาก!
WebSpanner

7

ที่จริงฉันพยายามสร้าง stdClass ที่ว่างเปล่าและเปรียบเทียบความเร็วกับคลาสที่ว่างเปล่า

class emp{}

จากนั้นดำเนินการสร้าง 1,000 stdClasses และ emps ต่อไป ... คลาสที่ว่างเปล่าเสร็จใน 1100 microseconds ในขณะที่ stdClasses ใช้เวลามากกว่า 1,700 microseconds ดังนั้นฉันจึงคิดว่ามันจะดีกว่าที่จะสร้างคลาสหุ่นของคุณเองสำหรับการจัดเก็บข้อมูลถ้าคุณต้องการใช้วัตถุเพื่อที่ไม่ดี (อาร์เรย์จะเร็วกว่ามากสำหรับทั้งการเขียนและการอ่าน)


22
เห็นได้ชัดว่าความแตกต่างเกิดจากความแตกต่างในความยาวชื่อ ถ้าคุณเรียกคลาส "averylongclassnamefornoapparentreason" มันจะใช้เวลาสร้างนานขึ้น ดังนั้นไปคิด
ปราชญ์

27
อืม ... การเพิ่มประสิทธิภาพก่อนวัยอันควร ฉันต้องการค้นหาคำสั่ง SQL ที่ซับซ้อนหรือปัญหาคอขวดของเครือข่ายอื่น ๆ หากฉันกังวลเรื่องความเร็วแทนที่จะใช้เวลาในการประหยัด 600 microseconds ที่จริงแล้วฉันควรตรวจสอบก่อนว่าจาวาสคริปต์อยู่ที่ท้ายกระดาษแทนที่จะเป็นหัวมากกว่าการดูแลหากหนึ่งคือ 600 microseconds เร็วกว่าอีก
Ardee Aram

6
1,000 มีขนาดเล็กเกินไปสำหรับมาตรฐานที่เชื่อถือได้ ลองพันล้าน
rightfold

1
ในโลก PHP นั้นมักจะดีกว่าการใช้อาร์เรย์
Vahid Amiri

^ ไม่แน่นอน Array Hell เป็นฝันร้ายเมื่อทำงานเป็นทีมในโครงการขนาดใหญ่
Davie Dave

6

วัตถุ stdClass ที่ใช้งานอยู่

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

จะสะท้อน

จอห์นโด


5

หากคุณต้องการสร้างวัตถุใหม่อย่างรวดเร็วเพื่อเก็บข้อมูลบางอย่างเกี่ยวกับหนังสือ คุณจะทำสิ่งนี้:

$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/สำหรับรายละเอียดเพิ่มเติม


4

โปรดจำไว้ว่า 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 >

เพราะมันไม่เหมือนกันดังนั้นมันจึงไม่สามารถเทียบเคียงกันได้ การเปรียบเทียบคลาสอย่างเข้มงวดทำงานกับการระบุอินสแตนซ์ แต่ละอินสแตนซ์ของคลาสใด ๆ มี ID เฉพาะ
Bednic

3

คู่มือ 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 ไม่ทำอะไรเลย


3

เป็นวิธีการที่ หลีกเลี่ยงการหยุดการตีความสคริปต์เมื่อมีข้อมูลบางอย่างจะต้องใส่ในชั้นเรียน แต่น่าเสียดายที่ชั้นนี้ไม่ได้กำหนดไว้

ตัวอย่าง:

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

ข้อมูลจะถูกใส่ไว้ใน 'งาน' ที่กำหนดไว้ล่วงหน้า แต่ถ้าเราทำรหัสตามนี้:

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

จากนั้น จะใส่ผลลัพธ์ใน .

ง่ายดาย บอกว่า: ดูสิเรามี KIDS ที่ดี [วัตถุ] ที่นี่ แต่ไม่มีพ่อแม่ ดังนั้นเราจะส่งพวกเขาไปที่ศูนย์ดูแลเด็กทารก :)


2

คุณยังสามารถใช้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];

วิธีที่สองส่วนใหญ่มีประโยชน์สำหรับการเริ่มต้นวัตถุด้วยคุณสมบัติมากมาย


1

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

อะไรที่ทำให้คนคิดเกี่ยวกับการใช้รูปแบบวัตถุแทนที่จะเป็นรูปแบบอาร์เรย์


0

เหตุผลที่เรามี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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.