请定义stdClass
是什么。
答案 0 :(得分:1087)
stdClass
只是在将其他类型转换为对象时使用的通用“空”类。尽管其他两个答案都说,stdClass
不是 PHP中对象的基类。这可以很容易地证明:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
我不相信PHP中存在基础对象的概念
答案 1 :(得分:731)
stdClass
是PHP的通用空类,类似于Java中的Object
或Python中的object
(编辑:,但实际上并未用作通用基类;感谢 @Ciaran pointing this out)。
它对匿名对象,动态属性等很有用。
考虑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
有关更多示例,请参阅Dynamic Properties in PHP and StdClass。
答案 2 :(得分:88)
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 :(得分:59)
另外值得注意的是,也可以使用stdClass
创建json_decode()
对象。
答案 4 :(得分:25)
使用 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开发人员,请参阅this example in the Joomla docs以进一步了解。
答案 5 :(得分:24)
同样,
$myNewObj->setNewVar = 'newVal';
产生一个stdClass对象 - 自动转换
今天我通过拼写错误找到了这个:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
酷!
答案 6 :(得分:9)
这里的答案包括stdClass
是匿名类甚至是匿名对象的表达式。这不是真的。
stdClass
只是一个常规的预定义类。您可以使用instanceof
运算符或函数get_class
进行检查。没什么特别的。在将其他值转换为object时,PHP使用此类。
在许多情况下,程序员使用stdClass
数组是更好的选择,因为有用的函数以及这个用例表示数据结构不是真实对象的事实。
答案 7 :(得分:7)
实际上我尝试创建空的stdClass并将速度与空类进行比较。
class emp{}
然后继续创建1000个stdClasses和emps ...空类在大约1100微秒内完成,而stdClasses花费了1700微秒。所以我想如果你想要那么糟糕地使用对象,那么创建你自己的虚拟类来存储数据会更好(对于写入和阅读来说,数组要快得多)。
答案 8 :(得分:5)
还值得注意的是,通过使用Casting,您实际上不需要像@Bandula给出的答案那样创建对象。相反,您可以简单地将数组转换为对象,并返回stdClass。例如:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
答案 9 :(得分:4)
如果您想快速创建一个新对象来保存有关图书的一些数据。你会做这样的事情:
$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/了解详情。
答案 10 :(得分:4)
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
答案 11 :(得分:4)
请记住,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 >
答案 12 :(得分:3)
stdclass是一种方法,php避免在有一些数据时停止解释脚本必须放在一个类中,但是 遗憾的是,这个班级没有定义
示例:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
此处数据将放入预定义的“任务”中。但是,如果我们这样做了代码:
return $statement->fetchAll(PDO::FETCH_CLASS );
简单php说:看,我们有一个很好的KIDS [对象]这里但没有父母。因此,我们会将它们发送给婴儿护理之家stdclass :)
答案 13 :(得分:2)
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类不会自动继承 从任何一个班级。除非明确说明,否则所有类都是独立的 扩展另一个类。 PHP与许多面向对象语言不同 在这方面。
你可以定义一个扩展stdClass的类,但是你会得到no 好处,因为stdClass什么都不做。
答案 14 :(得分:1)
您还可以使用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];
第二种方法主要用于初始化具有许多属性的对象。
答案 15 :(得分:0)
之所以拥有 stdClass ,是因为在PHP中无法将普通数组与关联数组区分开(就像在Javascript中,对象{}
和{{1 }},以区分它们。
因此,这为空对象创建了一个问题。以这个为例。
PHP:
[]
假设您要对$ c变量进行JSON编码
$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)
现在,假设您从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': []}
应该是一个关联数组,但是PHP(或诸如json_encode之类的任何函数)却不知道。
因此stdClass来了。再次以相同的例子
b
现在,即使您删除了$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)
中的所有键并将其设为空,由于它是stdClass,因此也就无关紧要了,当您对其进行json_encode编码时,您将得到以下信息:
$b
这也是echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
和json_encode
默认返回stdClass的原因。
json_decode