什么是PHP中的stdClass?
请定义stdClass
是什么。
stdClass
是PHP的通用空类,有点像Java中的Object
或Python中的object
( 编辑:但实际上并没有用作通用基类;感谢@Ciaran 指出了这一点 )。
这对匿名对象,dynamic属性等是有用的
例如,请参阅PHP和StdClass中的dynamic属性 。
stdClass
只是在将其他types转换为对象时使用的通用“空”类。 尽pipe其他两个答案说, stdClass
不是 PHP中的对象的基类。 这可以很容易地certificate:
class Foo{} $foo = new Foo(); echo ($foo instanceof stdClass)?'Y':'N'; // outputs 'N'
我不相信PHP中有一个基础对象的概念
stdClass是另一个伟大的PHPfunction。 你可以创build一个匿名的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创build一个新的PageShow对象。
在这里,不需要为此写一个新的类模板,只需使用stdClass即可创build一个类。
$pageview=new PageShow($page); $pageview->show();
另外值得注意的是,也可以使用json_decode()
来创build一个stdClass
对象。
同样,
$myNewObj->setNewVar = 'newVal';
产生一个stdClass对象 – 自动铸造
我今天通过拼写错误发现了这一点:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
凉!
使用stdClass你可以用它自己的属性创build一个新的对象。 考虑下面的例子,将用户的细节表示为关联数组。
$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文档中的此示例以进一步了解。
其实我试图创build空的stdClass和速度比较空课堂。
class emp{}
然后继续创build1000个stdClass和emps …空的类在1100微秒左右完成,而stdClasses占用了1700微秒。 所以我想最好是创build自己的虚拟类来存储数据,如果你想使用对象那么糟糕(数组在写入和读取时要快得多)。
stdClass不是匿名类或匿名对象
这里的答案包括expression式, stdClass
是一个匿名类,甚至是匿名对象。 这不是真的。
stdClass
只是一个常规的预定义的类。 您可以使用instanceof
运算符或函数get_class
来检查。 这里没什么特别的。 在将其他值转换为对象时,PHP使用此类。
在很多情况下,程序员使用stdClass
,数组是更好的select,因为有用的函数和这个用例代表数据结构不是真实的对象。
如果你想快速创build一个新的对象来保存关于一本书的一些数据。 你会做这样的事情:
$book = new stdClass; $book->title = "Harry Potter and the Prisoner of Azkaban"; $book->author = "JK Rowling"; $book->publisher = "Arthur A. Levine Books"; $book->amazon_link = "http://rads.stackoverflow.com/amzn/click/0439136369";
请检查网站 – http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-intead-array/了解更多详情。;
正在使用的stdClass对象
stdClass允许你创build匿名类和对象转换,你也可以访问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
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类不会自动从任何类inheritance。 所有的类都是独立的,除非他们明确地扩展了另一个类。 PHP在这方面与许多面向对象的语言不同。
你可以定义一个扩展stdClass的类,但是你不会得到任何好处,因为stdClass什么也不做。
stClass是由php本身创build的空类,应该只用于PHP,因为它不仅仅是一个“空”类,如果需要使用stdClass,php使用stdClass将数组转换为对象样式,我推荐两个更好的选项:1 – 使用数组(比类快得多)2 – 创build自己的空类并使用它
//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
将数组强制转换为您所select的对象:
Class Example { public $name; public $age; }
现在创build一个types为Example
的对象并初始化它,你可以执行以下任一操作:
$example = new Example(); $example->name = "some name"; $example->age = 22;
要么
$example = new Example(); $example = (object) ['name' => "some name", 'age' => 22];
第二种方法主要用于初始化具有许多属性的对象。
stdclass是一种避免停止解释脚本的方法,当有一些数据必须放在一个类,但不幸的是这个类没有定义
例如:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
这里的数据将被放在预定义的“任务”中。 但是,如果我们这样做的代码:
return $statement->fetchAll(PDO::FETCH_CLASS );
那么PHP会把结果放在stdclass中 。
只是PHP说:看,我们有一个很好的儿童[对象]在这里,但没有父母。 所以,我们会把他们送到幼儿托儿所stdclass 🙂