请定义什么stdClass
。
请定义什么stdClass
。
Answers:
stdClass
是PHP的通用空类,有点像Object
Java或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中的动态属性。
{}
构造。
function(StdClass $a, array $params)
检查是否$a
为object和instanceof
。
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';
}
}
现在,您必须使用Page Object创建一个新的PageShow对象。
在这里,无需为此编写新的类模板,您只需使用stdClass即时创建一个类。
$pageview=new PageShow($page);
$pageview->show();
stdClass
。
同样值得注意的是,stdClass
也可以使用来创建对象json_decode()
。
True
。布尔值是小写true
或false
。
使用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';
凉!
还值得注意的是,通过使用Casting,您实际上并不需要像@Bandula给出的答案那样创建对象。相反,您可以简单地将数组转换为对象,然后返回stdClass。例如:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
实际上,我尝试创建空的stdClass并将速度与空类进行比较。
class emp{}
然后继续创建1000个stdClasses和emps ...空类大约在1100微秒内完成,而stdClasses则花费了1700微秒。因此,我想最好是创建一个自己的虚拟类来存储数据,如果您想使用它的对象是如此之好(数组在写入和读取方面都快得多)。
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"]);
会回声
约翰·杜
如果要快速创建一个新对象来保存有关书籍的某些数据。您将执行以下操作:
$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/了解更多详细信息。
请记住,两个空的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没有属性,方法或父级。它不支持魔术方法,并且不实现任何接口。
当将标量或数组转换为Object时,将获得stdClass的实例。只要需要通用对象实例,就可以使用stdClass。
stdClass不是基类!PHP类不会自动从任何类继承。所有类都是独立的,除非它们显式扩展了另一个类。在这方面,PHP与许多面向对象的语言不同。
您可以定义一个扩展stdClass的类,但不会获得任何好处,因为stdClass不执行任何操作。
您还可以使用object
将数组强制转换为您选择的对象:
Class Example
{
public $name;
public $age;
}
现在要创建一个类型的对象Example
并对其进行初始化,您可以执行以下任一操作:
$example = new Example();
$example->name = "some name";
$example->age = 22;
要么
$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];
第二种方法对于初始化具有许多属性的对象最有用。
stClass是由php本身创建的空类,应该仅由php使用,因为它不仅是“空”类,如果需要使用stdClass,则php使用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';
是什么让人们考虑使用对象样式而不是数组样式?
之所以拥有stdClass,是因为在PHP中无法将普通数组与关联数组区分开(就像在Javascript中{}
,对象和[]
数组都可以区分它们)。
因此,这为空对象创建了一个问题。以这个为例。
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