Cách xác định một đối tượng trống trong PHP


384

với một mảng mới tôi làm điều này:

$aVal = array();

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

Có một cú pháp tương tự cho một đối tượng

(object)$oVal = "";

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

13
$var = (object) (boolean) (string) (int) (array) new StdClass; Bạn biết đấy, chỉ để được an toàn.
Xeoncross

1
Google đã lập chỉ mục tiêu đề câu hỏi này là : Arrays - How to define an empty object in PHP. Không liên quan gì đến mảng
Kolob Canyon

Câu trả lời:


848
$x = new stdClass();

Một nhận xét trong hướng dẫn tổng hợp nó tốt nhất:

stdClass là đối tượng PHP mặc định. stdClass không có thuộc tính, phương thức hoặc cha. Nó không hỗ trợ các phương thức ma thuật, và thực hiện không có giao diện.

Khi bạn truyền một vô hướng hoặc mảng là Object, bạn sẽ có một thể hiện của stdClass. Bạn có thể sử dụng stdClass bất cứ khi nào bạn cần một thể hiện đối tượng chung.


5
$ o = (đối tượng) NULL; - Nếu một đối tượng được chuyển đổi thành một đối tượng, nó không được sửa đổi. Nếu một giá trị của bất kỳ loại nào khác được chuyển đổi thành một đối tượng, một thể hiện mới của lớp dựng sẵn stdClass được tạo. Nếu giá trị là NULL, thì thể hiện mới sẽ trống. Mảng chuyển đổi thành một đối tượng với các thuộc tính được đặt tên bởi các khóa và các giá trị tương ứng. Đối với bất kỳ giá trị nào khác, một biến thành viên có tên vô hướng sẽ chứa giá trị.
DDS

11
Tôi chỉ nói stdClasstrong đầu là "lớp tiêu chuẩn"
sjagr

1
Nếu bạn cứ quên sử dụng câu trả lời của tôi :)
RafaSashi

26
Nếu bạn gặp phải "không tìm thấy": new \stdClass(); PHP Namespace Doc
2540625

3
@IvanCastellanos bạn có thể giải thích làm thế nào bạn có thể nhớ stdClass()từ này AIDS?
Adam

117

Cách tiêu chuẩn để tạo một đối tượng "trống" là:

$oVal = new stdClass();

Nhưng, với PHP> = 5.4, cá nhân tôi thích sử dụng:

$oVal = (object)[];

Nó ngắn hơn và cá nhân tôi cho rằng nó rõ ràng hơn vì stdClass có thể gây hiểu lầm cho các lập trình viên mới làm quen (tức là "Này, tôi muốn một đối tượng, không phải là một lớp!" ...).

Tương tự với PHP <5.4 là:

$oVal = (object) array();

(object)[]tương đương với new stdClass().

Xem hướng dẫn sử dụng PHP ( tại đây ):

stdClass : Được tạo bằng cách đánh máy cho đối tượng.

và ( ở đây ):

Nếu một đối tượng được chuyển đổi thành một đối tượng, nó không được sửa đổi. Nếu một giá trị của bất kỳ loại nào khác được chuyển đổi thành một đối tượng, một thể hiện mới của lớp dựng sẵn stdClass được tạo .


Tuy nhiên, hãy nhớ rằng sản phẩm nào ($ oVal) trả về sai , như @PaulP đã nói:

Các đối tượng không có thuộc tính không còn được coi là trống rỗng.

Về ví dụ của bạn, nếu bạn viết:

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

PHP tạo Cảnh báo sau, ngầm định tạo thuộc tính key1 (chính đối tượng)

Cảnh báo: Tạo đối tượng mặc định từ giá trị trống

Đây có thể là một vấn đề nếu cấu hình của bạn (xem mức báo cáo lỗi ) hiển thị cảnh báo này cho trình duyệt. Đây là toàn bộ chủ đề khác, nhưng cách tiếp cận nhanh và bẩn có thể sử dụng toán tử kiểm soát lỗi (@) để bỏ qua cảnh báo:

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

3
Thay vì khắc phục sự cố, bạn đang tạo một vấn đề mới. Vấn đề cần khắc phục là mọi người nên biết những gì stdClass.
Pacerier

2
Tôi đã viết những gì stdClasskhông. Tôi đã sử dụng stdClasstrên mã mà trả lời câu hỏi. Tôi xin lỗi nhưng tôi không tạo ra một vấn đề mới, đó là ý kiến ​​cá nhân của tôi (như tôi đã viết).
cgaldiolo

6
"sở thích cá nhân"! = "vấn đề"
cgaldiolo 30/03/2015

4
@Pacerier, tôi không hiểu sự bướng bỉnh của bạn. Câu hỏi là 'Cách xác định một đối tượng trống trong PHP'. Câu trả lời của tôi là chính xác và tôi đã viết để sử dụng "new stdClass ()". Mã mà tôi đã cung cấp cho người dùng 'ed209' là chính xác và tôi đã sử dụng "new stdClass ()". Ngoài ra, tôi đã thêm một ý kiến ​​cá nhân và tôi đã sử dụng một "cá nhân" táo bạo để rõ ràng rằng đó không phải là cách "chuẩn" để đi. Theo ý kiến ​​khiêm tốn của tôi, một vấn đề đáng được nhận xét rất nhiều nên ít nhất là một câu trả lời sai. Thay vào đó nếu bạn coi ý kiến ​​cá nhân là một vấn đề, có thể đây là vấn đề cho việc chia sẻ ý tưởng mang tính xây dựng.
cgaldiolo

9
Tôi thực sự thích tốc ký(object) []
Rahil Wazir

35

Tôi muốn chỉ ra rằng trong PHP không có thứ gọi là đối tượng trống rỗng:

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

nhưng tất nhiên $ obj sẽ trống.

Mặt khác, mảng trống có nghĩa là trống trong cả hai trường hợp

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

Trích dẫn từ hàm changelog trống

Các đối tượng không có thuộc tính không còn được coi là trống rỗng.


Tôi không thể tìm thấy trích dẫn đó trong changelog cho trống.
powpow12

@ powpow12 Nó đã từng ở đó . Nó đã được thay đổi trong 5.0.0.
Stanley Umeanozie

18

php.net cho biết nó là tốt nhất:

$new_empty_object = new stdClass();

Vâng, điều này chắc chắn là cách được đề nghị.
Hudson Pereira

14

Tôi thích cách dễ dàng tạo các đối tượng thuộc loại ẩn danh trong JavaScript:

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

Vì vậy, tôi luôn cố gắng viết loại đối tượng này trong PHP như javascript hiện :

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

Nhưng về cơ bản, đây là một mảng, bạn không thể thực hiện những việc như gán các hàm ẩn danh cho một thuộc tính như 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)"

Chà, bạn có thể làm điều đó, nhưng IMO không thực tế / sạch sẽ:

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

Ngoài ra, sử dụng synthax này, bạn có thể tìm thấy một số bất ngờ thú vị , nhưng hoạt động tốt trong hầu hết các trường hợp.


1
Đây phải là câu trả lời được chấp nhận
Mike Aron

11

Ngoài câu trả lời của zombat nếu bạn cứ quên stdClass

   function object(){

        return new stdClass();

    }

Bây giờ bạn có thể làm:

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

Tôi yêu kỹ thuật này, mặc dù hầu hết các IDE sẽ không nêu bật thuật ngữ "đối tượng" là một chức năng có thể gây nhầm lẫn cho các lập trình viên khác. Nhưng này, nó làm việc cho tôi!
Brixster

7

Bạn có thể sử dụng new stdClass()(được khuyến nghị):

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

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

Hoặc bạn có thể chuyển đổi một mảng trống thành một đối tượng tạo ra một thể hiện trống mới của lớp dựng sẵn stdClass:

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

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

Hoặc bạn có thể chuyển đổi nullgiá trị thành một đối tượng tạo ra một thể hiện trống mới của lớp dựng sẵn stdClass:

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

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

5

để truy cập dữ liệu trong stdClass theo cách tương tự bạn làm với một mảng xã hội, chỉ cần sử dụng cú pháp {$ 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

Như những người khác đã chỉ ra, bạn có thể sử dụng stdClass. Tuy nhiên tôi nghĩ rằng nó sạch hơn mà không có (), như vậy:

$obj = new stdClass;

Tuy nhiên dựa trên câu hỏi, có vẻ như điều bạn thực sự muốn là có thể thêm thuộc tính vào một đối tượng khi đang di chuyển. Bạn không cần sử dụng stdClass cho điều đó, mặc dù bạn có thể. Thực sự bạn có thể sử dụng bất kỳ lớp học. Chỉ cần tạo một thể hiện đối tượng của bất kỳ lớp nào và bắt đầu thiết lập các thuộc tính. Tôi thích tạo lớp riêng của mình có tên đơn giản là o với một số chức năng mở rộng cơ bản mà tôi muốn sử dụng trong các trường hợp này và rất hay để mở rộng từ các lớp khác. Về cơ bản nó là lớp đối tượng cơ sở của riêng tôi. Tôi cũng muốn có một hàm đơn giản là o (). Thích như vậy:

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

function o() {
  return new o;
}

Nếu bạn không muốn có loại đối tượng cơ sở của riêng mình, bạn có thể chỉ cần o () trả về một stdClass mới. Một lợi thế là o dễ nhớ hơn stdClass và ngắn hơn, bất kể bạn sử dụng nó làm tên lớp, tên hàm hay cả hai. Ngay cả khi bạn không có bất kỳ mã nào trong lớp o của mình, việc ghi nhớ vẫn dễ dàng hơn so với stdClass được viết hoa và đặt tên một cách vụng về (có thể gọi ra ý tưởng về 'lớp bệnh lây truyền qua đường tình dục'). Nếu bạn tùy chỉnh lớp o, bạn có thể tìm thấy cách sử dụng hàm o () thay vì cú pháp hàm tạo. Đây là một hàm bình thường trả về một giá trị, ít bị giới hạn hơn một hàm tạo. Ví dụ, tên hàm có thể được truyền dưới dạng chuỗi cho hàm chấp nhận tham số có thể gọi được. Một chức năng cũng hỗ trợ xích. Vì vậy, bạn có thể làm một cái gì đó như:

Đây là một khởi đầu tuyệt vời cho một "ngôn ngữ" cơ bản để xây dựng các lớp ngôn ngữ khác với lớp trên cùng được viết bằng DSL bên trong đầy đủ. Điều này tương tự với phong cách phát triển không thể thiếu và PHP hỗ trợ nó tốt hơn hầu hết mọi người nhận ra. Tôi nhận ra đây là một chút tiếp tuyến cho câu hỏi, nhưng câu hỏi chạm vào những gì tôi nghĩ là cơ sở để sử dụng đầy đủ sức mạnh của PHP.


2
@Pacerier có nghĩa là không có dấu ngoặc đơn? ;) cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1

1
Đó là một lỗi đánh máy, nó nên là dấu ngoặc đơn.
Pacerier


4

Nếu bạn muốn tạo đối tượng (như trong javascript) với các thuộc tính động, mà không nhận được cảnh báo về thuộc tính không xác định.

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

Bạn cũng có thể thử cách này.

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

Đầu ra:

object(stdClass)#1 (0) { }

4

Sử dụng một đối tượng chung và các cặp giá trị khóa ánh xạ tới nó.

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

Hoặc truyền một mảng vào một đối tượng

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

3

Nếu bạn không muốn làm điều này:

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

Bạn có thể sử dụng một trong những điều sau đây:

PHP> = 5,4

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

PHP <5,4

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

3

Dưới đây là một ví dụ với phép lặp:

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

Bạn có kỹ thuật xấu nhưng hữu ích này:

$var = json_decode(json_encode([]), FALSE);

0

stdClass là đối tượng PHP mặc định. stdClass không có thuộc tính, phương thức hoặc cha. Nó không hỗ trợ các phương thức ma thuật, và thực hiện không có giao diện.

Khi bạn truyền một vô hướng hoặc mảng là Object, bạn sẽ có một thể hiện của stdClass. Bạn có thể sử dụng stdClass bất cứ khi nào bạn cần một thể hiện đối tượng chung.

<?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 KHÔNG phải là một lớp cơ sở! Các lớp PHP không tự động kế thừa từ bất kỳ lớp nào. Tất cả các lớp là độc lập, trừ khi chúng rõ ràng mở rộng một lớp khác. PHP khác với nhiều ngôn ngữ hướng đối tượng về mặt này.

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

Bạn không thể định nghĩa một lớp có tên 'stdClass' trong mã của bạn. Tên đó đã được sử dụng bởi hệ thống. Bạn có thể định nghĩa một lớp có tên 'Object'.

Bạn có thể định nghĩa một lớp mở rộng stdClass, nhưng bạn sẽ không có lợi ích gì, vì stdClass không làm gì cả.

(đã thử nghiệm trên PHP 5.2.8)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.