PHP中的stdClass是什么?


Answers:


785

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


7
也许他使用了mysql_fetch_object。如果我没记错的话,它会创建一个stdlcass实例。
加伦,

69
它不是Java的Object对象的基类,请参阅下面的答案。
Ciaran McNulty

1
我希望您知道对象不是Python中“所有”对象的派生类...至少直到您被迫从Python 3.0中的对象派生
monokrome

11
我认为人们应该说stdClass类似于JavaScript的{}构造。
Earth Engine

主席先生,您的回答部分不正确,因为文章不正确。扩展此类的唯一(也是错误的)事情是选择提示类型,即function(StdClass $a, array $params)检查是否$a为object和instanceof
Dejan Marjanovic 2014年

1114

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

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

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


4
std代表什么?
亚当·怀特

47
STD =标准-
托马斯拉多

1
这是一个实用程序类!顺便说一句,这是真正的评论!
古斯塔夫

16
实际上,代码段之后的第一句话回答了这个问题。
MauganRa 2014年

2
@Miro Markaravanes:动态属性可以分配给PHP中的任何类,而不仅仅是stdClass。
StanE

95

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 Object创建一个新的PageShow对象。

在这里,无需为此编写新的类模板,您只需使用stdClass即时创建一个类。

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

3
一个空类,它具有可用于行的有用函数,也是一种更好的编码标准
borrel

1
它将与使用数组相同。实际上,STDclass是在类型处理时生成的,如数组到对象的转换。
varuog

1
请更正您的代码中的错字:($ this-> currentpage-> name == 1)应该是($ this-> currentpage-> status == 1)
2014年

7
“您可以创建一个匿名PHP类”- 这不是一个匿名类。您可以使用instanceof,get_class,...
约翰·史密斯

2
由于PHP实际上具有匿名类,因此与这个问题非常不同,这个答案特别令人困惑stdClass
IMSoP

59

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


5
真正。我经常使用json_encode和json_decode转换数组对象数组,在必要的时候。
pinkal vansia 2013年

6
$ X = json_decode(json_encode($对象),TRUE)将对象解码成一个数组,但它不是二进制安全的。本质上,如果不是纯文本,则可能会在JSON中中断。
simontemplar

@simontemplar在PHP中,您不应该编写True。布尔值是小写truefalse
BadHorsie

2
@simontemplar该手册没有,但PSR-2却有,因此,如果您遵循任何一种标准,都应使用小写字母。当然,如果您想以这种方式编写它是有效的,但是您应该遵循标准。布尔值的手册文档将非常古老,可能是在标准形成之前编写的。坦白地说,PHP最初是一个没有任何标准的烂摊子(请参阅所使用的各种变量/函数/对象命名约定)。老实说,我从未见过任何PHP代码在开发人员使用您的格式的地方。
BadHorsie '16

2
除了True / False / Null之外,我确实遵循PSR-2,并在类的自己行上加上了开括号。除此之外,我不在乎。但是,如果曾经编辑别人的代码,我会遵循他们使用的任何标准(如果有的话,通常是没有标准),如果我做不到,请以“正确”的方式进行PSR-2。我有很多麻烦的代码,还有很多其他问题,三个关键字的大写字母是我最不用担心的。
simontemplar '16

26

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


24

同样

$myNewObj->setNewVar = 'newVal'; 

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

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

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

凉!


9
但这应该会引发E_NOTICE
Petah

3
@Petah仅在PHP 5.3+中正确吗?但是,可以肯定,这是一种不好的做法。
ChristoKiwi 2014年

15

stdClass不是匿名类或匿名对象

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

stdClass只是一个常规的预定义类。您可以使用instanceof运算符或功能进行检查get_class。这里没什么特别的。当将其他值转换为对象时,PHP使用此类。

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


8

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

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

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

Output: again


爱它。干净得多!
WebSpanner

7

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

class emp{}

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


22
显然,差异是由名称长度的差异引起的。如果您将该类称为“ averylongclassnamefornoapparentreason”,则创建时间会更长。所以去图。
Sage 2013年

27
嗯...过早的优化。如果我真正关心速度,我宁愿查找复杂的SQL查询或其他网络瓶颈,而不要花时间节省600微秒。实际上,我宁愿先检查javascript是否位于页脚而不是顶部,而不要关心一个是否比另一个快600微秒。
Ardee Aram

6
1000对于可靠的基准来说太小了。尝试十亿。
2014年

1
在PHP世界中,使用数组几乎总是更好。
Vahid Amiri

^绝对不是。在团队中处理大型项目时,阵列地狱是一场噩梦。
戴维·戴夫

6

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

会回声

约翰·杜



4

请记住,两个空的stdClasses并不严格相等。在编写嘲讽期望时,这一点非常重要。

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 >

因为它不是同一实例,所以不能使它们彼此相等。类的严格比较与实例标识一起使用。任何类的每个实例都有唯一的ID。
Bednic

3

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不执行任何操作。


3

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

范例:

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

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

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

然后 将结果放入

只是 说:看,我们这里有一个很好的KIDS [Objects],但是没有Parents。因此,我们会将它们发送给幼儿保育所 :)


2

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

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


1

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

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


0

之所以拥有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_encode,并json_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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.