StCClass trong PHP là gì?


Câu trả lời:


785

stdClasslà lớp trống chung chung của PHP, giống như Objecttrong Java hoặc objecttrong Python ( Chỉnh sửa: nhưng không thực sự được sử dụng làm lớp cơ sở phổ quát; cảm ơn @Ciaran đã chỉ ra điều này ).

Nó rất hữu ích cho các đối tượng ẩn danh, thuộc tính động, v.v.

Một cách dễ dàng để xem xét StdClass là một cách thay thế cho mảng kết hợp. Xem ví dụ dưới đây cho thấy cách json_decode()cho phép lấy một cá thể StdClass hoặc một mảng kết hợp. Ngoài ra nhưng không được hiển thị trong ví dụ này, SoapClient::__soapCalltrả về một thể hiện 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

Xem các thuộc tính động trong PHP và StdClass để biết thêm ví dụ.


7
có lẽ anh ấy đã sử dụng mysql_fetch_object. tạo ra một thể hiện của stdlcass nếu tôi không nhầm.
Galen

69
Nó không hoàn toàn là một lớp cơ sở theo cách đối tượng của Java, xem câu trả lời của tôi dưới đây.
Ciaran McN Khoa

1
Tôi hy vọng bạn biết rằng đối tượng không phải là lớp dẫn xuất của các đối tượng "tất cả" trong Python ... Ít nhất, cho đến khi bạn buộc phải xuất phát từ đối tượng trong Python 3.0
đơn sắc

11
Tôi nghĩ mọi người nên nói rằng stdClass giống như {}cấu trúc của JavaScript .
Động cơ Trái đất

Thưa bạn, câu trả lời của bạn là một phần không chính xác vì bài viết không chính xác. Điều duy nhất (và điều này cũng sai), việc mở rộng lớp này cung cấp cho bạn là tùy chọn để nhập gợi ý, tức là function(StdClass $a, array $params)kiểm tra nếu $alà đối tượng và instanceof.
Dejan Marjanovic

1114

stdClasschỉ là một lớp 'trống' chung chung được sử dụng khi truyền các loại khác vào các đối tượng. Mặc dù những gì hai câu trả lời khác nói, stdClasskhông những lớp cơ sở cho các đối tượng trong PHP. Điều này có thể được chứng minh khá dễ dàng:

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

Tôi không tin có một khái niệm về một đối tượng cơ sở trong PHP


4
Std đứng để làm gì?
Adam Chờ đợi

47
std = tiêu chuẩn -
Tomas Prado

1
Đó là một lớp tiện ích! Btw đây là nhận xét thực sự!
Gustav

16
Trên thực tế, câu đầu tiên sau đoạn mã trả lời câu hỏi.
MauganRa

2
@Miro Markaravanes: Các thuộc tính động có thể được gán cho bất kỳ lớp nào trong PHP, không chỉ stdClass.
StanE

95

stdClass là một tính năng tuyệt vời khác của PHP. Bạn có thể tạo một lớp PHP ẩn danh. Hãy kiểm tra một ví dụ.

$page=new stdClass();
$page->name='Home';
$page->status=1;

bây giờ nghĩ rằng bạn có một lớp khác sẽ khởi tạo với một đối tượng trang và thực thi cơ sở trê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';
    }
}

Bây giờ bạn phải tạo một đối tượng PageShow mới với Đối tượng Trang.

Ở đây không cần phải viết Mẫu lớp mới cho việc này, bạn chỉ cần sử dụng stdClass để tạo Class khi đang di chuyển.

    $pageview=new PageShow($page);
    $pageview->show();

3
một lớp trống với các hàm hữu ích hoạt động với các hàng, cũng là một tiêu chuẩn mã hóa tốt hơn
borrel

1
Nó sẽ giống như sử dụng mảng. Trong thực tế, STDgroup được tạo tại thời điểm sắp xếp kiểu như chuyển đổi mảng sang đối tượng.
varuog

1
Vui lòng sửa một lỗi đánh máy trong mã của bạn: ($ this-> currentpage-> name == 1) phải là ($ this-> currentpage-> status == 1)
Enriqe

7
"Bạn có thể tạo một lớp PHP ẩn danh" - Đây không phải là một lớp ẩn danh . Bạn có thể sử dụng instanceof, get_group, ...
John Smith

2
Câu trả lời này đặc biệt khó hiểu khi PHP thực sự có các lớp ẩn danh , rất khác với stdClass.
IMSoP

59

Cũng đáng chú ý, một stdClassđối tượng có thể được tạo ra từ việc sử dụng json_decode()là tốt.


5
Thật. Tôi thường xuyên sử dụng json_encode và json_decode để chuyển đổi mảng thành đối tượng thành mảng, khi cần thiết.
vansia màu hồng

6
$ x = json_decode (json_encode ($ object), True) sẽ giải mã đối tượng thành một mảng, nhưng nó không an toàn nhị phân. Về cơ bản nếu nó không phải là văn bản gốc thì nó có thể bị hỏng trong JSON.
simontemplar

@simontemplar Trong PHP bạn không nên viết True. Booleans là chữ thường truehoặc false.
BadHorsie

2
@simontemplar Hướng dẫn không có, nhưng PSR-2 thì có, vì vậy nếu bạn tuân theo bất kỳ loại tiêu chuẩn nào thì nó phải ở dạng chữ thường. Chắc chắn, nếu bạn muốn viết nó theo cách đó hợp lệ nhưng bạn nên tuân theo các tiêu chuẩn. Các tài liệu thủ công cho booleans sẽ rất cũ, có thể được viết trước khi các tiêu chuẩn được hình thành. Hãy thành thật mà nói, PHP ban đầu được viết như một mớ hỗn độn mà không có bất kỳ tiêu chuẩn nào (xem phạm vi rộng của các quy ước đặt tên biến / hàm / đối tượng được sử dụng). Tôi thực sự chưa bao giờ thấy bất kỳ mã PHP nào mà nhà phát triển đã sử dụng định dạng của bạn.
BadHorsie

2
Tôi thực hiện theo PSR-2 ngoại trừ True / false / Null và đặt dấu ngoặc nhọn trên các dòng riêng của chúng cho các lớp. Ngoài ra, tôi không quan tâm. Tuy nhiên, nếu đã từng chỉnh sửa mã của người khác, tôi sẽ tuân theo bất kỳ tiêu chuẩn nào họ đang sử dụng (nếu có, thường là không) và không thực hiện được, hãy thực hiện PSR-2 theo cách "đúng". Có rất nhiều mã khủng khiếp ngoài kia với hàng tấn vấn đề khác mà việc viết hoa ba từ khóa là điều tôi lo lắng nhất.
simontemplar

26

Sử dụng stdClass bạn có thể tạo một đối tượng mới với các thuộc tính riêng của nó. Hãy xem xét ví dụ sau đại diện cho các chi tiết của người dùng như một mảng kết hợp.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

Nếu bạn cần biểu diễn các chi tiết giống như các thuộc tính của một đối tượng, bạn có thể sử dụng stdClass như dưới đây.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

Nếu bạn là một nhà phát triển Joomla hãy tham khảo ví dụ này trong các tài liệu Joomla để hiểu thêm.


24

Tương tự như vậy,

$myNewObj->setNewVar = 'newVal'; 

mang lại một đối tượng stdClass - tự động đúc

Tôi phát hiện ra điều này ngày hôm nay bằng cách viết sai chính tả:

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

Mát mẻ!


9
Nhưng điều này sẽ tăng E_NOTICE
Petah

3
@Petah Chỉ trong PHP 5.3+ mặc dù phải không? Nhưng vâng, đó là thực tế xấu cho chắc chắn.
ChristoKiwi

15

stdClass không phải là một lớp ẩn danh hoặc đối tượng ẩn danh

Câu trả lời ở đây bao gồm các biểu thức stdClasslà một lớp ẩn danh hoặc thậm chí là đối tượng ẩn danh. Đó không phải là sự thật.

stdClasschỉ là một lớp học được xác định trước thông thường. Bạn có thể kiểm tra điều này bằng cách sử dụng instanceoftoán tử hoặc chức năng get_class. Không có gì đặc biệt ở đây. PHP sử dụng lớp này khi truyền các giá trị khác cho đối tượng.

Trong nhiều trường hợp stdClassđược các lập trình viên sử dụng, mảng là tùy chọn tốt hơn, bởi vì các hàm hữu ích và thực tế là usecase này đại diện cho cấu trúc dữ liệu không phải là một đối tượng thực sự.


8

Cũng đáng lưu ý rằng bằng cách sử dụng Casting, bạn thực sự không cần phải tạo một đối tượng như trong câu trả lời được đưa ra bởi @Bandula. Thay vào đó, bạn có thể chỉ cần truyền mảng của mình đến một đối tượng và stdClass được trả về. Ví dụ:

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

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

Output: again


Yêu nó. Sạch sẽ hơn nhiều!
WebSpanner

7

Thật ra tôi đã thử tạo stdClass trống và so sánh tốc độ với lớp trống.

class emp{}

sau đó tiến hành tạo 1000 stdClass và emps ... các lớp trống được thực hiện trong khoảng 1100 micro giây trong khi stdClass mất hơn 1700 micro giây. Vì vậy, tôi đoán sẽ tốt hơn nếu tạo lớp giả của riêng bạn để lưu trữ dữ liệu nếu bạn muốn sử dụng các đối tượng quá tệ (mảng nhanh hơn rất nhiều cho cả viết và đọc).


22
Rõ ràng sự khác biệt là do sự khác biệt về độ dài tên. nếu bạn gọi lớp là "averylong classnamefornoapparentreason", sẽ mất nhiều thời gian hơn để tạo. cứ thế đi.
Hiền nhân

27
Hmmm ... tối ưu hóa sớm. Tôi thà tìm các truy vấn SQL phức tạp hoặc các nút cổ chai mạng khác nếu tôi thực sự quan tâm đến tốc độ hơn là dành thời gian tiết kiệm 600 micro giây. Trên thực tế, tôi muốn kiểm tra đầu tiên nếu javascript ở chân trang thay vì ở đầu hơn là quan tâm nếu cái này nhanh hơn 600 micro giây so với cái kia.
Ardee Aram

6
1000 là quá nhỏ cho một điểm chuẩn đáng tin cậy. Hãy thử một tỷ.
đúng vào

1
Trong thế giới PHP, hầu như luôn luôn tốt hơn để sử dụng các mảng.
Vahid Amiri

^ Chắc chắn là không như vậy. Array hell là một cơn ác mộng khi làm việc trong một nhóm trong một dự án lớn.
Davie Dave

6

đối tượng stdClass đang sử dụng

StdClass cho phép bạn tạo các lớp ẩn danh và với việc truyền đối tượng, bạn cũng có thể truy cập các khóa của một mảng kết hợp theo kiểu OOP. Giống như bạn sẽ truy cập vào tài sản đối tượng thông thường.

Thí dụ

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

sẽ lặp lại

John Doe


5

Nếu bạn muốn nhanh chóng tạo một đối tượng mới để chứa một số dữ liệu về một cuốn sách. Bạn sẽ làm một cái gì đó như thế này:

$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/";

Vui lòng kiểm tra trang web - http://www.webmaster-source.com/2009/08/20/php-stdgroup-storing-data-object-instead-array/ để biết thêm chi tiết.


4

Xin lưu ý rằng 2 stdClass trống không hoàn toàn bằng nhau. Điều này rất quan trọng khi viết những kỳ vọng nhạo báng.

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 >

Bởi vì nó không phải là cùng một thể hiện, nên nó không thể bằng nhau. So sánh nghiêm ngặt các lớp làm việc với nhận dạng cá thể. Mỗi phiên bản của bất kỳ lớp nào có ID duy nhất.
Bednic

3

Hướng dẫn sử dụng php.net có một vài lời giải thích và ví dụ chắc chắn được đóng góp bởi người dùng về stdClass là gì, tôi đặc biệt thích bài này http://php.net/manual/en/lingu.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

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.

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.

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ả.


3

là một cách mà tránh dừng việc diễn giải tập lệnh khi có một số dữ liệu phải được đặt trong một lớp, nhưng tiếc là lớp này không được xác định

Thí dụ :

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

Tại đây, dữ liệu sẽ được đặt trong 'Nhiệm vụ' được xác định trước. Nhưng, nếu chúng ta đã làm mã như thế này:

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

sau đó sẽ đưa kết quả vào .

đơn giản nói rằng: hãy nhìn xem, chúng ta có một KIDS tốt [Đối tượng] Ở đây nhưng không có Cha mẹ. Vì vậy, chúng tôi sẽ gửi chúng đến Nhà chăm sóc trẻ sơ sinh :)


2

Bạn cũng có thể sử dụng objectđể truyền mảng cho một đối tượng bạn chọn:

Class Example
{
   public $name;
   public $age;
}

Bây giờ để tạo một đối tượng kiểu Examplevà để khởi tạo nó, bạn có thể thực hiện một trong các cách sau:

$example = new Example();
$example->name = "some name";
$example->age = 22;

HOẶC LÀ

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

Phương thức thứ hai chủ yếu hữu ích để khởi tạo các đối tượng có nhiều thuộc tính.


1

stClass là một lớp rỗng do chính php tạo ra và chỉ nên được sử dụng bởi php, vì nó không chỉ là một lớp "rỗng", php sử dụng stdClass để chuyển đổi các mảng thành kiểu đối tượng nếu bạn cần sử dụng stdClass, tôi khuyên bạn nên sử dụng hai tùy chọn tốt hơn : 1- sử dụng mảng (nhanh hơn nhiều so với các lớp) 2- tạo lớp trống của riêng bạn và sử dụng 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';

Điều gì khiến ai đó nghĩ về việc sử dụng kiểu đối tượng thay vì kiểu mảng ???


0

Lý do tại sao chúng ta có stdClass là vì trong PHP không có cách nào để phân biệt một mảng bình thường với một mảng liên kết (như trong Javascript bạn có {}cho đối tượng và []cho mảng để phân biệt chúng).

Vì vậy, điều này tạo ra một vấn đề cho các đối tượng trống. Lấy ví dụ này

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)

Giả sử bạn muốn mã hóa JSON biến $ c

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

Bây giờ hãy nói rằng bạn đã xóa tất cả các khóa từ $b để làm cho nó trống. Vì $bbây giờ trống (bạn đã xóa tất cả các khóa có nhớ không?), Dường như []đó có thể là một mảng hoặc đối tượng nếu bạn nhìn vào nó.

Vì vậy, nếu bạn làm lại json_encode, đầu ra sẽ khác

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

Đây là một vấn đề bởi vì chúng tôi biết brằng nó được cho là một mảng liên kết nhưng PHP (hoặc bất kỳ chức năng nào như json_encode) thì không.

Vì vậy, stdClass đến để giải cứu. Lấy ví dụ tương tự một lần nữa

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

Vì vậy, ngay cả khi bạn xóa tất cả các khóa khỏi $bvà làm cho nó trống, vì nó là một stdClass, nó sẽ không thành vấn đề và khi bạn json_encode, bạn sẽ nhận được điều này:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

Đây cũng là lý do tại sao json_encodejson_decodetheo mặc định trả về 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
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.