什么是PHP中的stdClass?

What is stdClass in PHP?

请定义stdClass是什么。


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

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

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


EDOCX1 0是PHP的通用空类,类似于在Java中的EDCOX1 1或EDCOX1,1在Python中使用(编辑:但实际上不作为通用基类使用;谢谢@ CiARAN指出这一点)。

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

考虑stdclass的一个简单方法是作为关联数组的替代方法。请参阅下面的示例,该示例显示json_decode()如何允许获取stdclass实例或关联数组。同样,但在本例中没有显示,SoapClient::__soapCall返回stdclass实例。

1
2
3
4
5
6
7
8
9
10
<?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是另一个很好的PHP特性。您可以创建一个匿名的PHP类。让我们检查一个例子。

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

现在假设您有另一个类,该类将用一个页面对象初始化并基于它执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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';
    }
}

现在,您必须用页面对象创建一个新的pageshow对象。

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

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


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


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

1
2
3
4
5
$array_user = array();
$array_user["name"] ="smith john";
$array_user["username"] ="smith";
$array_user["id"] ="1002";
$array_user["email"] ="[email protected]";

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

1
2
3
4
5
$obj_user = new stdClass;
$obj_user->name ="smith john";
$obj_user->username ="smith";
$obj_user->id ="1002";
$obj_user->email ="[email protected]";

如果您是Joomla开发人员,请参阅Joomla文档中的此示例以进一步了解。


同样地,

1
$myNewObj->setNewVar = 'newVal';

生成stdclass对象-自动强制转换

我今天拼错了:

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

酷!


stdclass不是匿名类或匿名对象

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

stdClass只是一个常规的预定义类。您可以使用instanceof操作符或函数get_class来检查这个问题。这里没什么特别的。PHP在将其他值强制转换为对象时使用这个类。

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


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

1
class emp{}

然后创建了1000个stdclasses和emp…空类大约在1100微秒内完成,而stdclasses超过1700微秒。所以我想如果你想如此糟糕地使用对象的话,最好创建自己的虚拟类来存储数据(数组的写入和读取速度都要快得多)。


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

1
2
3
4
5
6
7
8
$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

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

Output: again


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

1
2
3
4
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-storeing-data-object-instead-array/。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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对象正在使用中

stdclass允许您创建匿名类和通过对象强制转换,还可以以OOP样式访问关联数组的键。就像访问常规对象属性一样。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


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

例子:

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

在这里,数据将被放入预先定义的"任务"中。但是,如果我们这样做的话:

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

然后PHP将结果放入stdclass。

简单地说:看,我们这里有一个好孩子(对象),但没有父母。所以,我们会把他们送到儿童保育院的stdclass:)


《php.net手册》中有一些关于stdclass是什么的用户的可靠解释和示例,我特别喜欢这本书:http://php.net/manual/en/language.oop5.basic.php 92123,https://stackoverflow.com/a/1434375/2352773。

stdClass is the default PHP object. stdClass has no properties,
methods or parent. It does not support magic methods, and implements
no interfaces.

When you cast a scalar or array as Object, you get an instance of
stdClass. You can use stdClass whenever you need a generic object
instance.

stdClass is NOT a base class! PHP classes do not automatically inherit
from any class. All classes are standalone, unless they explicitly
extend another class. PHP differs from many object-oriented languages
in this respect.

You could define a class that extends stdClass, but you would get no
benefit, as stdClass does nothing.


stclass是一个由php本身创建的空类,只能由php使用。因为它不仅仅是一个"空"类,PHP使用stdclass将数组转换为对象样式如果需要使用stdclass,我推荐两个更好的选项:1-使用数组(比类快得多)2-创建自己的空类并使用它

1
2
3
4
5
6
7
8
9
//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';

是什么让人想到使用对象样式而不是数组样式????


您还可以使用Object将数组强制转换为您选择的对象:

1
2
3
4
5
Class Example
{
   public $name;
   public $age;
}

现在,要创建Example类型的对象并对其进行初始化,可以执行以下任一操作:

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

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

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