PHP中的stdClass是什么?

请定义stdClass是什么。

660780 次浏览

stdClass是PHP的通用空类,有点像Java中的Object或Python中的object编辑:但实际上并没有用作通用基类;谢谢@夏兰对于指出这一点)。

它对匿名对象、动态属性等很有用。

考虑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中的动态属性

stdClass只是一个通用的“空”类,用于将其他类型转换为对象。不管其他两个答案怎么说,stdClass没有 PHP中对象的基类。这可以很容易地演示:

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

我不相信PHP中有一个基本对象的概念

同样,

$myNewObj->setNewVar = 'newVal';

生成一个stdClass对象-自动转换

我今天通过拼写错误发现了这一点:

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

酷!

同样值得注意的是,也可以使用json_decode()创建stdClass对象。

stdClass是另一个很棒的PHP特性。您可以创建一个匿名PHP类。让我们检查一个例子。

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

现在假设您有另一个类,它将使用page对象初始化并在其上执行。

<?phpclass 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';}}

现在您必须使用Page Object创建一个新的PageShow对象。

这里不需要为此编写一个新的类模板,您可以简单地使用stdClass动态创建一个类。

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

实际上,我尝试创建空stdClass并将速度与空类进行比较。

class emp{}

然后继续创建1000个stdClass和emps……空类在大约1100微秒内完成,而stdClass花费了1700微秒。所以我想如果你非常想使用对象来存储数据,最好创建自己的虚拟类(数组在写入和读取方面都快得多)。

使用标准类,您可以使用它自己的属性创建一个新对象。考虑以下示例,它将用户的详细信息表示为关联数组。

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

如果您需要表示与对象属性相同的详细信息,您可以使用标准类如下。

$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文档中的这个例子以进一步了解。

如果你想快速创建一个新对象来保存一本书的一些数据。你会这样做:

$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/了解更多详情。

您还可以使用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];

第二种方法主要用于初始化具有许多属性的对象。

stdClass不是匿名类或匿名对象

这里的答案包括stdClass是匿名类甚至匿名对象的表达式。它不是真的。

stdClass只是一个常规的预定义类。您可以使用instanceof运算符或函数get_class检查这一点。这里没有什么特别之处。PHP在将其他值转换为对象时使用此类。

在程序员使用stdClass的许多情况下,数组是更好的选择,因为它有有用的函数,而且这个用例代表的数据结构不是一个真实的对象。

php.net手册有一些可靠的解释和示例,由用户贡献stdClass是什么,我特别喜欢这个http://php.net/manual/en/language.oop5.basic.php#92123https://stackoverflow.com/a/1434375/2352773

stdClass是默认的PHP对象。stdClass没有属性,方法或父方法。它不支持魔术方法,并实现没有接口。

将标量或数组转换为Object时,会得到一个stdClass。每当您需要泛型对象时,您都可以使用stdClass实例。

stdClass不是基类!PHP类不会自动继承所有类都是独立的,除非它们明确扩展另一个类。PHP与许多面向对象的语言不同在这方面

你可以定义一个扩展stdClass的类,但你不会得到好处,因为stdClass什么都不做。

使用中的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"]);

将回响

John Doe

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 stdClassclass data={}$data=new data();$data->k1='v1';$data->k2='v2';

是什么让某人考虑使用对象风格而不是数组风格???

避免在必须将一些数据放入类时停止解释脚本的一种方式,但是不幸的是,这个类没有定义

示例:

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

这里的数据将放在预定义的“任务”中。但是,如果我们这样做代码:

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

然后将结果放在中。

简单地说:看,我们这里有一个好的孩子[对象],但没有父母。所以,我们将把他们送到婴儿托儿所:)

还值得注意的是,通过使用强制转换,您实际上不需要像@Bandula给出的答案中那样创建一个对象。相反,您可以简单地将数组强制转换为一个对象,并返回stdClass。例如:

$array = array('Property1'=>'hello','Property2'=>'world','Property3'=>'again',);
$obj = (object) $array;echo $obj->Property3;

Output: again

请记住,2个空stdClass并不严格相等。这在编写嘲弄期望时非常重要。

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 >

我们之所以有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)

假设您想对变量$c进行JSON编码

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

PHP中的stdClass是经典的泛型类。它没有内置属性或方法。基本上,它用于转换类型、创建具有动态属性的对象等。如果您有javascript背景,您可以确定为

$o = new \stdClass();

相当于

const o = {};

它创建空对象,稍后由程序控制流填充。