What is stdClass in 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的一个简单方法是作为关联数组的替代方法。请参阅下面的示例,该示例显示
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(); |
同样值得注意的是,使用
使用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,并将速度与空类进行了比较。
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; |
如果你想快速创建一个新的对象来保存关于一本书的一些数据。您可以这样做:
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 |
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'; |
是什么让人想到使用对象样式而不是数组样式????
您还可以使用
1 2 3 4 5 | Class Example { public $name; public $age; } |
现在,要创建
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]; |
第二种方法主要用于初始化具有许多属性的对象。