Câu trả lời:
stdClass
là lớp trống chung chung của PHP, giống như Object
trong Java hoặc object
trong 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::__soapCall
trả 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ụ.
{}
cấu trúc của JavaScript .
function(StdClass $a, array $params)
kiểm tra nếu $a
là đối tượng và instanceof
.
stdClass
chỉ 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, stdClass
là khô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
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();
stdClass
.
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.
True
. Booleans là chữ thường true
hoặc false
.
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.
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ẻ!
Câu trả lời ở đây bao gồm các biểu thức stdClass
là 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.
stdClass
chỉ 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 instanceof
toá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ự.
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
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).
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.
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
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.
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 >
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ả.
lớp học là một cách mà php 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 đó php sẽ đưa kết quả vào lớp học .
đơn giản phpnó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ơ sinhlớp học :)
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 Example
và để 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.
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 ???
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ì $b
bâ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 b
rằ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 $b
và 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_encode
và json_decode
theo 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