1131

请定义是什么stdClass

4

18 回答 18

1150

stdClass只是一个通用的“空”类,在将其他类型转换为对象时使用。尽管其他两个答案说了什么,但stdClass不是PHP 中对象的基类。这可以很容易地证明:

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

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

于 2009-06-14T11:13:47.650 回答
840

stdClass是 PHP 的通用空类,有点像ObjectJava 或objectPython 中的(编辑:但实际上并未用作通用基类;感谢@Ciaran 指出这一点)。

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

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

于 2009-05-31T05:55:50.387 回答
109

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

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

现在认为您有另一个类将使用页面对象进行初始化并基于它执行。

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

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

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

    $pageview=new PageShow($page);
    $pageview->show();
于 2012-12-08T09:20:36.580 回答
63

另外值得注意的是,stdClass对象也可以从使用中创建json_decode()

于 2011-10-11T19:11:39.137 回答
30

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

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

如果您需要表示与对象属性相同的细节,您可以使用stdClass如下。

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

于 2015-04-06T14:21:10.580 回答
27

同样地,

$myNewObj->setNewVar = 'newVal'; 

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

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

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

凉爽的!

于 2010-05-19T13:47:28.867 回答
21

stdClass 不是匿名类或匿名对象

此处的答案包括stdClass作为匿名类甚至匿名对象的表达式。这不是真的。

stdClass只是一个常规的预定义类。您可以使用instanceofoperator 或 function进行检查get_class。这里没有什么特别的。PHP 在将其他值转换为对象时使用此类。

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

于 2016-03-05T10:04:20.307 回答
15

我们有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': {}}

这也是为什么默认返回stdClassjson_encode的原因。json_decode

 $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
于 2020-01-24T18:07:33.747 回答
11

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

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

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

Output: again

于 2018-01-11T11:35:34.887 回答
7

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

class emp{}

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

于 2013-03-23T15:02:33.697 回答
7

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

会回声

约翰·多伊

于 2017-04-23T03:52:31.970 回答
6

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

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

当您将标量或数组转换为 Object 时,您将获得 stdClass 的一个实例。您可以在需要通用对象实例时使用 stdClass。

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

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

于 2016-06-19T14:42:23.257 回答
5

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

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

于 2015-10-14T10:02:57.167 回答
5

是一种当必须将某些数据放入类中时避免停止解释脚本的方法,但不幸的是,该类没有定义

例子 :

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

在这里,数据将被放入预定义的 'Tasks' 中。但是,如果我们这样编写代码:

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

然后会将结果放入

简单的说:看,我们有一个很好的 KIDS[Objects] Here 但没有父母。所以,我们会将它们送到婴儿托儿所 :)

于 2017-09-29T12:38:49.507 回答
4

请记住,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 >
于 2018-03-13T10:48:21.680 回答
2

stClass 是 php 自己创建的空类,应该只供 php 使用,因为它不仅仅是一个“空”类,如果需要使用 stdClass,php 使用 stdClass 将数组转换为对象样式,我推荐两个更好的选择: 1- 使用数组(比类快得多) 2- 创建自己的空类并使用它

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

是什么让人们考虑使用对象样式而不是数组样式???

于 2017-08-11T21:34:23.697 回答
1

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

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

于 2016-01-28T07:35:13.667 回答
0

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

$o = new \stdClass();

相当于

const o = {};

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

于 2021-12-07T08:02:40.957 回答