题
请定义什么 stdClass
是。
解决方案
stdClass
是PHP的通用空类,有点像在Java中(Object
或object
Python中的编辑:,但没有实际使用的通用基类;感谢的 @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 获得更多的例子。
其他提示
stdClass
仅仅是一个通用的“空”铸造的其它类型的对象时所使用的类。尽管其他两个答案说什么,stdClass
是不会的基地在PHP对象类。这可以相当容易地证明:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
我不相信有一个基础对象的PHP中的概念
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';
}
}
现在你需要创建一个页面对象的新PageShow对象。
在这里没有必要写一个新的类模板为此,你可以简单地使用stdClass的,以动态地创建一个类。
$pageview=new PageShow($page);
$pageview->show();
另外值得注意的,一个stdClass
对象可以从使用json_decode()
,以及被创建。
使用 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文档做进一步的了解。
同样地,
$myNewObj->setNewVar = 'newVal';
产生一个stdClass的对象 - 自动浇铸
我今天发现了这一点由拼写错误:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
酷!
stdClass的不是匿名类或匿名对象
答案在这里包括表达式stdClass
是匿名类或甚至匿名对象。这不是一个真实的。
stdClass
只是一个普通的预定义的类。您可以检查此使用instanceof
运算符或函数get_class
。没什么特别放在这里。 PHP使用这个类铸造其它值到对象时。
在许多情况下,因为有用的功能,而这用例表示的数据结构的事实,其中stdClass
使用由程序员阵列是更好的选择,而不是一个真实对象。
事实上,我试图创建空stdClass的和比较的速度到空类。
class emp{}
然后就创造1000个stdClasses和环境管理计划...空类是在公元1100年左右完成微秒,而stdClasses接手1700微秒。所以我想它能够更好地创建自己的虚拟类用于存储数据,如果你想使用的对象得很厉害(阵列快很多关于写入和读取)。
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"]);
将回声
John Doe的
其还值得注意的是,通过铸造你实际上并不需要创建一个对象作为由@Bandula给出了答案。相反,你可以简单地投你的数组对象并返回stdClass的。例如:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
如果您想快速创建一个新对象来保存有关书籍的一些数据。你会做这样的事情:
$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/ 更多细节。
请记住,2个空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 >
php.net 手册有一些由用户贡献的关于 stdClass 是什么的可靠解释和示例,我特别喜欢这个 http://php.net/manual/en/language.oop5.basic.php#92123, https://stackoverflow.com/a/1434375/2352773.
stdClass 是默认的 PHP 对象。STDClass没有属性,方法或父。它不支持魔术方法,也不实现任何接口。
当您将标量或数组作为对象施加时,您将获得stdclass的实例。您可以在需要通用对象实例时使用STDClass。
stdClass 不是基类!PHP类不会自动从任何类中继承。所有类都是独立的,除非它们明确扩展另一个类。在这方面,PHP与许多面向对象的语言有所不同。
您可以定义一个扩展STDClass的类,但是您不会受益,因为STDClass什么都没做。
stdClass的是一种方式,其中在<一类=“标签后的” href =“/问题/标记/ PHP的”称号=“显示标记的问题‘PHP’”的rel =“标签”> PHP 避免停止解释脚本时有一些数据必须放在一类,但 不幸的是这类没有定义
示例:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
下面的数据将被放置在预定的“任务”。但是,如果我们这样做的代码如下:
return $statement->fetchAll(PDO::FETCH_CLASS );
只需 PHP 说:看,我们有一个良好的KIDS [物体]在这里,但没有父母。因此,我们将它们送到婴儿儿童保育家庭 stdClass的一> :)
您还可以使用object
投阵列到您选择的对象:
Class Example
{
public $name;
public $age;
}
现在创建类型Example
的一个对象,并对其进行初始化您可以执行这些:
$example = new Example();
$example->name = "some name";
$example->age = 22;
OR
$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];
的第二种方法是用于与许多属性初始化对象最有用。
stClass是由PHP本身创建一个空的类,并应在PHP仅被使用, 因为它不只是一个“空”类, PHP使用stdClass的转换数组对象样式 如果你需要使用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';
什么使有人考虑使用,而不是阵列式???
的对象的风格