请定义stdClass
是什么。
stdClass
是一个通用的“空”类,用于将其他类型转换为对象。尽管其他两个答案所说的那样,stdClass
不是 PHP 中对象的基类。这可以很容易地证明:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
我不认为PHP中有基础对象的概念。
stdClass
是PHP的通用空类,有点像Java中的Object
或Python中的object
(编辑:但实际上不作为通用基类使用;感谢@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的动态属性获取更多示例。
{}
构造。 - Earth Enginefunction(StdClass $a, array $params)
,而不是检查 $a
是否为对象和 instanceof
。 - Dejan Marjanović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()
创建。
True
。布尔值应该是小写的 true
或 false
。 - BadHorsie$myNewObj->setNewVar = 'newVal';
返回一个stdClass对象 - 自动转换
今天我通过拼错发现了这个:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
很酷!
$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
{}
表示对象,[]
表示数组来区分它们)。PHP:
$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)
假设您想要对变量 $c 进行 JSON 编码
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': []}
这是一个问题,因为我们知道b
应该是一个关联数组,但PHP(或任何类似json_encode的函数)并不知道。
所以stdClass来拯救。再次以相同的例子为例。
$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)
现在即使你从$b
中删除所有的键并将其置为空,由于它是stdClass,这并不重要,当你json_encode时,你会得到这个:
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
这也是为什么json_encode
和json_decode
默认返回stdClass的原因。
$c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
// $c is now ['a' => [1,2,3], 'b' => []] in PHP
// if you json_encode($c) again your data is now corrupted
stdClass
仅仅是因为 json_encode()
和 json_decode()
的使用。你可以始终将 json_decode()
的结果收集为递归数组,而不需要处理 stdClass
,对于 json_encode()
,你可以像这个答案中展示的那样使用类型转换为 (object),这在技术上创建了 stdClass
,但你不需要在实际源代码中编码它,也不需要关心实际的内部实现细节。简而言之,在 PHP 中你永远不需要自己使用 stdClass
。 - Mikko Rantalainen这里的答案包括表达式,认为stdClass
是一个匿名类甚至是匿名对象。事实并非如此。
stdClass
只是一个常规的预定义类。您可以使用instanceof
运算符或get_class
函数来验证此内容。在这里没有任何特殊之处。PHP在将其他值转换为对象时使用此类。
在许多情况下,程序员使用stdClass
的地方,数组是更好的选择,因为它具有有用的函数,并且这种用法代表数据结构而不是真正的对象。
stdClass
大多是因为不理解 PHP 中 json_encode()
的实际工作方式而意外使用的。您可以仅使用(可能是递归的)数组构建所需的所有数据,并且 json_encode()
将发出数组或对象,具体取决于您在每个数组中使用的是数字键还是字符串键。如果您确实需要一个类,则最好实际定义一个真正的类。stdClass
在功能上与 class stdClass {}
相同。 - Mikko Rantalainen值得注意的是,使用强制类型转换时,您不需要像@Bandula所提供的答案中那样创建对象。 相反,您可以将数组简单地强制转换为对象,这将返回stdClass。例如:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
输出:again
stdClass允许您创建匿名类,并且通过对象转换,您还可以以面向对象的方式访问关联数组的键。就像访问常规对象属性一样。
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"]);
将会回显
约翰·多
Object
类和PHP的stdClass
之间差异的主要因素是动态属性。在Java的Object
对象中,您不允许定义动态属性(或变量),但是在PHP的stdClass
对象中可以这样做。 - Miro Markaravanes