วิธีการกำหนดวัตถุว่างเปล่าใน PHP


384

ด้วยอาร์เรย์ใหม่ที่ฉันทำเช่นนี้:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

มีไวยากรณ์ที่คล้ายกันสำหรับวัตถุ

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

13
$var = (object) (boolean) (string) (int) (array) new StdClass; คุณก็รู้ว่าปลอดภัย
Xeoncross

1
Google Arrays - How to define an empty object in PHPได้จัดทำดัชนีชื่อคำถามนี้เป็น: ไม่มีส่วนเกี่ยวข้องกับอาร์เรย์
Kolob Canyon

คำตอบ:


848
$x = new stdClass();

ความคิดเห็นในคู่มือเงินก้อนมันได้ดีที่สุด:

stdClass เป็นวัตถุ PHP เริ่มต้น stdClass ไม่มีคุณสมบัติวิธีการหรือผู้ปกครอง มันไม่รองรับวิธีการเวทย์มนตร์และไม่มีส่วนต่อประสาน

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


5
$ o = (วัตถุ) NULL; - หากวัตถุถูกแปลงเป็นวัตถุจะไม่ถูกปรับเปลี่ยน ถ้าค่าชนิดอื่นถูกแปลงเป็นวัตถุอินสแตนซ์ใหม่ของคลาสบิวด์อิน stdClass จะถูกสร้างขึ้น ถ้าค่าเป็น NULL อินสแตนซ์ใหม่จะว่างเปล่า อาร์เรย์แปลงเป็นวัตถุที่มีคุณสมบัติตั้งชื่อตามคีย์และค่าที่เกี่ยวข้อง สำหรับค่าอื่น ๆ ตัวแปรสมาชิกที่ชื่อว่า scalar จะมีค่า
DDS

11
ฉันเพียงแค่พูดstdClassในหัวของฉันเป็น "ระดับมาตรฐาน"
sjagr

1
ถ้าคุณให้ลืมใช้คำตอบของฉัน :)
RafaSashi

26
หากคุณพบ "ไม่พบ": new \stdClass(); PHP Namespace Doc
2540625

3
@IvanCastellanos คุณสามารถอธิบายวิธีที่คุณจำได้stdClass()จากคำว่าAIDS?
Adam

117

วิธีมาตรฐานในการสร้างวัตถุ "ว่าง" คือ:

$oVal = new stdClass();

แต่ด้วย PHP> = 5.4 ฉันเองชอบใช้:

$oVal = (object)[];

มันสั้นกว่าและฉันคิดว่ามันชัดเจนกว่าเพราะstdClassอาจทำให้เข้าใจผิดกับโปรแกรมเมอร์มือใหม่ (เช่น "เฮ้ฉันต้องการวัตถุไม่ใช่คลาส!" ... )

เช่นเดียวกันกับ PHP <5.4 คือ:

$oVal = (object) array();

(object)[]new stdClass()เทียบเท่ากับ

ดูคู่มือ PHP ( ที่นี่ ):

stdClass : สร้างโดยพิมพ์ไปยังวัตถุ

และ ( ที่นี่ ):

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


อย่างไรก็ตามโปรดจำไว้ว่าempty ($ oVal) จะส่งกลับค่า falseเนื่องจาก @PaulP กล่าวว่า:

วัตถุที่ไม่มีคุณสมบัติจะไม่ถือว่าว่างเปล่าอีกต่อไป

เกี่ยวกับตัวอย่างของคุณถ้าคุณเขียน:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

PHP สร้างคำเตือนดังต่อไปนี้โดยปริยายสร้างคุณสมบัติkey1(วัตถุเอง)

คำเตือน: การสร้างวัตถุเริ่มต้นจากค่าว่าง

นี่อาจเป็นปัญหาหากการกำหนดค่าของคุณ (ดูระดับการรายงานข้อผิดพลาด ) แสดงคำเตือนนี้ไปยังเบราว์เซอร์ นี่เป็นอีกหัวข้อทั้งหมด แต่แนวทางที่รวดเร็วและสกปรกอาจใช้ตัวดำเนินการควบคุมข้อผิดพลาด (@)เพื่อละเว้นคำเตือน:

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";

3
แทนที่จะแก้ไขปัญหาคุณกำลังสร้างใหม่ ปัญหาที่ต้องแก้ไขคือคนควรรู้ว่าstdClassทำอะไร
Pacerier

2
ฉันเขียนสิ่งที่stdClassทำ ฉันใช้stdClassโค้ดที่ตอบคำถาม ฉันขอโทษ แต่ฉันไม่ได้สร้างปัญหาใหม่นั่นคือความเห็นส่วนตัวของฉัน (ตามที่ฉันเขียน)
cgaldiolo

6
"การตั้งค่าส่วนตัว"! = "ปัญหา"
cgaldiolo

4
@Pierier ฉันไม่เข้าใจความดื้อรั้นของคุณ คำถามคือ 'วิธีการกำหนดวัตถุว่างเปล่าใน PHP' คำตอบของฉันถูกต้องและฉันเขียนเพื่อใช้ "new stdClass ()" รหัสที่ฉันให้กับผู้ใช้ 'ed209' ถูกต้องและฉันใช้ "new stdClass ()" นอกจากนี้ฉันได้เพิ่มความคิดเห็นส่วนตัวและฉันใช้ตัวหนา "ส่วนตัว" เพื่อให้ชัดเจนว่าไม่ใช่วิธี "มาตรฐาน" ที่จะไป ในความเห็นที่ต่ำต้อยของฉันปัญหาที่ควรได้รับความคิดเห็นจำนวนมากอย่างน้อยก็ควรเป็นคำตอบที่ผิด แต่ถ้าคุณพิจารณาความเห็นส่วนตัวปัญหาอาจนี้เป็นปัญหาสำหรับการแบ่งปันสร้างสรรค์ของความคิด
cgaldiolo

9
ฉันชอบจดชวเลข(object) []
Rahil Wazir

35

ฉันต้องการชี้ให้เห็นว่าใน PHP ไม่มีสิ่งเช่นวัตถุเปล่าในแง่:

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

แต่แน่นอนว่า $ obj จะว่างเปล่า

ในทางกลับกันอาร์เรย์ที่ว่างเปล่าหมายถึงว่าว่างเปล่าในทั้งสองกรณี

$arr = array();
var_dump(empty($arr));

อ้างอิงจากฟังก์ชันการเปลี่ยนแปลงว่างเปล่า

วัตถุที่ไม่มีคุณสมบัติจะไม่ถือว่าว่างเปล่าอีกต่อไป


ฉันไม่พบใบเสนอราคาในการเปลี่ยนแปลงนั้นว่างเปล่า
powpow12

@ powpow12 จะใช้เป็นมี มันมีการเปลี่ยนแปลงใน 5.0.0
Stanley Umeanozie


14

ฉันชอบที่จะสร้างวัตถุประเภทไม่ระบุชื่อใน JavaScript ได้ง่ายเพียงใด:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

ดังนั้นฉันมักจะพยายามเขียนวัตถุประเภทนี้ใน PHP เหมือน javascript :

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

แต่เนื่องจากนี่เป็นอาร์เรย์คุณไม่สามารถทำสิ่งต่าง ๆ เช่นกำหนดฟังก์ชั่นที่ไม่ระบุชื่อให้กับคุณสมบัติเช่น js:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

คุณสามารถทำได้ แต่ IMO นั้นใช้งานไม่ได้ / ทำความสะอาด:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

นอกจากนี้การใช้ synthax นี้คุณสามารถพบความประหลาดใจที่ตลกแต่ก็ใช้ได้ดีในกรณีส่วนใหญ่


1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Mike Aron

11

นอกจากคำตอบของซอมบี้หากคุณยังลืม stdClass

   function object(){

        return new stdClass();

    }

ตอนนี้คุณสามารถทำได้:

$str='';
$array=array();
$object=object();

ฉันชอบเทคนิคนี้แม้ว่า IDEs ส่วนใหญ่จะไม่เน้นคำว่า "object" เป็นฟังก์ชั่นซึ่งอาจสร้างความสับสนให้กับโปรแกรมเมอร์คนอื่น ๆ แต่เฮ้มันใช้งานได้สำหรับฉัน!
Brixster

7

คุณสามารถใช้new stdClass()(ซึ่งแนะนำ):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

หรือคุณสามารถแปลงอาเรย์ว่างเป็นวัตถุที่สร้างอินสแตนซ์ว่างใหม่ของคลาสบิวด์อิน stdClass:

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

หรือคุณสามารถแปลงnullค่าเป็นวัตถุที่สร้างอินสแตนซ์ที่ว่างเปล่าใหม่ของคลาสบิวด์อิน stdClass:

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 

5

ในการเข้าถึงข้อมูลใน stdClass ในลักษณะที่คล้ายกับที่คุณทำกับอาเรย์เชิงสัมพันธ์เพียงแค่ใช้ไวยากรณ์ {$ var}

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};

4

ตามที่คนอื่น ๆ ได้ชี้ให้เห็นคุณสามารถใช้ stdClass อย่างไรก็ตามฉันคิดว่ามันสะอาดกว่าหากไม่มี () ดังนี้:

$obj = new stdClass;

อย่างไรก็ตามตามคำถามดูเหมือนว่าสิ่งที่คุณต้องการจริงๆคือสามารถเพิ่มคุณสมบัติให้กับวัตถุได้ทันที คุณไม่จำเป็นต้องใช้ stdClass แต่คุณสามารถทำได้ จริงๆคุณสามารถใช้คลาสใดก็ได้ เพียงแค่สร้างวัตถุตัวอย่างของชั้นเรียนใด ๆ และเริ่มการตั้งค่าคุณสมบัติ ฉันชอบที่จะสร้างชั้นเรียนของตัวเองที่มีชื่อเป็นเพียงแค่กับฟังก์ชั่นการขยายพื้นฐานบางอย่างที่ฉันชอบที่จะใช้ในกรณีเหล่านี้และเป็นสิ่งที่ดีสำหรับการขยายจากชั้นเรียนอื่น ๆ โดยทั่วไปมันเป็นคลาสวัตถุพื้นฐานของฉันเอง ฉันชอบที่จะมีฟังก์ชั่นชื่อ o () เพียงอย่างเดียว ชอบมาก

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

หากคุณไม่ต้องการมีประเภทวัตถุพื้นฐานของคุณเองคุณสามารถให้ o () คืนค่า stdClass ใหม่ ข้อดีอย่างหนึ่งคือว่า o จำได้ง่ายกว่า stdClass และสั้นกว่าโดยไม่คำนึงว่าคุณใช้เป็นชื่อคลาสชื่อฟังก์ชันหรือทั้งสองอย่าง แม้ว่าคุณจะไม่มีรหัสใด ๆ ในชั้นเรียนของคุณมันยังง่ายต่อการจดจำได้ง่ายกว่าตัวพิมพ์ใหญ่และชื่อ stdClass (ซึ่งอาจเรียกความคิดของ 'คลาสโรคติดต่อทางเพศสัมพันธ์') หากคุณปรับแต่งคลาส o คุณอาจพบการใช้งานสำหรับฟังก์ชั่น o () แทนไวยากรณ์ของตัวสร้าง มันเป็นฟังก์ชั่นปกติที่ส่งกลับค่าซึ่งมีข้อ จำกัด น้อยกว่าตัวสร้าง ตัวอย่างเช่นชื่อฟังก์ชั่นสามารถส่งผ่านเป็นสตริงไปยังฟังก์ชั่นที่ยอมรับพารามิเตอร์ callable ฟังก์ชั่นยังรองรับการเชื่อมโยง ดังนั้นคุณสามารถทำสิ่งที่ชอบ:

นี่คือจุดเริ่มต้นที่ดีสำหรับ "ภาษา" พื้นฐานในการสร้างเลเยอร์ภาษาอื่น ๆ ด้วยเลเยอร์ชั้นบนที่เขียนด้วย DSL ภายในแบบเต็ม สิ่งนี้คล้ายกับรูปแบบการพัฒนาที่กระเพื่อมและ PHP สนับสนุนวิธีที่ดีกว่าที่คนส่วนใหญ่รับรู้ ฉันรู้ว่านี่เป็นบิตของสัมผัสแทนสำหรับคำถาม แต่คำถามสัมผัสกับสิ่งที่ฉันคิดว่าเป็นฐานสำหรับการใช้ประโยชน์อย่างเต็มที่ของ PHP


2
@Pacerier คุณหมายถึงวงเล็บหรือเปล่า? ;) cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1

1
นั่นคือการพิมพ์ผิดมันควรจะเป็นวงเล็บ
Pacerier


4

หากคุณต้องการสร้างวัตถุ (เช่นในจาวาสคริปต์) ด้วยคุณสมบัติแบบไดนามิกโดยไม่ได้รับคำเตือนเกี่ยวกับคุณสมบัติที่ไม่ได้กำหนด

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null

4

คุณสามารถลองด้วยวิธีนี้ได้เช่นกัน

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>

เอาท์พุท:

object(stdClass)#1 (0) { }

4

ใช้วัตถุทั่วไปและจับคู่ค่าคีย์แมปกับมัน

$oVal = new stdClass();
$oVal->key = $value

หรือโยนอาเรย์เข้าไปในวัตถุ

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;

3

หากคุณไม่ต้องการทำสิ่งนี้:

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

คุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้:

PHP> = 5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

PHP <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);

3

นี่คือตัวอย่างที่มีการทำซ้ำ:

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>


0

stdClass เป็นวัตถุ PHP เริ่มต้น stdClass ไม่มีคุณสมบัติวิธีการหรือผู้ปกครอง มันไม่รองรับวิธีการเวทย์มนตร์และไม่มีส่วนต่อประสาน

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

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

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

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

คุณไม่สามารถกำหนดคลาสที่ชื่อว่า 'stdClass' ในรหัสของคุณ ระบบใช้ชื่อนี้แล้ว คุณสามารถกำหนดคลาสที่ชื่อว่า 'วัตถุ'

คุณสามารถกำหนดคลาสที่ขยาย stdClass แต่คุณจะไม่ได้รับประโยชน์เนื่องจาก stdClass ไม่ทำอะไรเลย

(ทดสอบกับ PHP 5.2.8)

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