题 什么是PHP中的stdClass?


请定义一下 stdClass 是。


912
2018-05-31 05:49


起源




答案:


stdClass 是PHP的通用空类,有点像 Object 在Java或 object 在Python中(编辑: 但实际上并没有用作通用基类;谢谢 @Ciaran for  指出这一点)。

它对匿名对象,动态属性等很有用。

考虑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中的动态属性 更多例子。


680
2018-05-31 05:55



也许他使用了mysql_fetch_object。如果我没有弄错的话会创建一个stdlcass实例。 - Galen
它不像Java的Object那样是基类,请参阅下面的答案。 - Ciaran McNulty
@Ciaran,你是对的,相应地编辑我的答案。 - Alex Martelli
我希望你知道对象不是Python中“所有”对象的派生类...至少,直到你被迫从Python 3.0中的对象派生出来 - monokrome
我想人们应该说stdClass就像JavaScript一样 {} 构造。 - Earth Engine


stdClass 只是在将其他类型转换为对象时使用的通用“空”类。尽管其他两个答案说的是, stdClass 是  PHP中对象的基类。这可以很容易地证明:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

我不相信PHP中存在基础对象的概念


1055
2018-06-14 11:13



什么是std代表什么? - Adam Waite
标准=标准 - - Tomas Prado
这是一个实用类!顺便说一下这是真正的评论! - Gustav
实际上,代码片段后面的第一句话回答了这个问题。 - MauganRa
@Miro Markaravanes:动态属性可以分配给PHP中的任何类,而不仅仅是stdClass。 - StanE


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即可创建一个Class。

    $pageview=new PageShow($page);
    $pageview->show();

80
2017-12-08 09:20



一个空类,包含有效的函数,可以处理行,也是一个更好的编码标准 - borrel
它与使用数组相同。事实上,STDclass是在类型杂乱的时候生成的,比如数组到对象的转换。 - varuog
请更正代码中的拼写错误:($ this-> currentpage-> name == 1)应为($ this-> currentpage-> status == 1) - Enriqe
“你可以创建一个匿名的PHP类” - 这不是一个匿名的课程。你可以使用instanceof,get_class,...... - John Smith
这个答案现在特别令人困惑 PHP实际上有匿名类,这是非常不同的 stdClass。 - IMSoP


另外值得注意的是,一个 stdClass 对象可以从使用中创建 json_decode() 同样。


58
2017-10-11 19:11



真正。我经常使用json_encode和json_decode将数组转换为对象到数组,必要时。 - pinkal vansia
$ x = json_decode(json_encode($ object),True)会将对象解码为数组,但它不是二进制安全的。基本上如果它不是明文,它可能会破坏JSON。 - simontemplar
@simontemplar在PHP中你不应该写 True。布尔是小写的 true 要么 false。 - BadHorsie
@simontemplar手册没有,但是 PSR-2 是的,所以如果你遵循任何一种标准,它应该是小写的。当然,如果你想以这种方式写它 有效 但你应该遵循标准。布尔值的手册文档将非常陈旧,可能是在标准形成之前编写的。说实话,PHP最初是在没有任何标准的情况下编写的完整混乱(参见广泛使用的变量/函数/对象命名约定)。老实说,我从未见过开发人员使用过您的格式的任何PHP代码。 - BadHorsie
我确实遵循PSR-2,除了True / False / Null并且在他们自己的行上打开括号用于类。除此之外,我只是不在乎。但是,如果编辑其他人的代码,我会遵循他们正在使用的任何标准(如果有的话,通常都没有),如果不这样做,那么PSR-2就是“正确”的方式。有很多令人难以置信的代码存在大量的其​​他问题,三个关键字的资本化是我最不担心的。 - simontemplar


同样,

$myNewObj->setNewVar = 'newVal'; 

产生一个stdClass对象 - 自动铸造

今天我通过拼写错误找到了这个:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

凉!


24
2018-05-19 13:47



但这应该引发E_NOTICE - Petah
@Petah仅在PHP 5.3+中虽然对吗?但是,这肯定是不好的做法。 - ChristoKiwi
@ChristoKiwi 5.2也引发了一个错误: viper-7.com/SWIZe1 - Petah


运用 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文档中 进一步了解。


20
2018-04-06 14:21





实际上我尝试创建空的stdClass并将速度与空类进行比较。

class emp{}

然后继续创建1000个stdClasses和emps ...空类在大约1100微秒内完成,而stdClasses花费了1700微秒。所以我想如果你想要那么糟糕地使用对象,那么创建自己的虚拟类来存储数据会更好(对于写入和读取来说,数组要快得多)。


7
2018-03-23 15:02



显然,差异是由名称长度的差异引起的。如果你把这个类称为“averylongclassnamefornoapparentreason”,那么创建它需要更长的时间。所以去看看。 - Sage
嗯...过早优化。如果我真的关心速度而不是花费时间节省600微秒,我宁愿找到复杂的SQL查询或其他网络瓶颈。实际上,我宁愿首先检查javascript是否在页脚上而不是在头部,而不是关心如果一个比另一个快600微秒。 - Ardee Aram
1000对于可靠的基准来说太小了。尝试十亿。 - rightfold
在PHP世界中,使用数组几乎总是更好。 - Vahid Amiri
^绝对不是这样。在一个大型项目的团队中工作时,阵列地狱是一场噩梦。 - Davie Dave


stdClass不是匿名类或匿名对象

这里的答案包括表达式 stdClass 是一个匿名类甚至是匿名对象。这不是真的。

stdClass 只是一个常规的预定义类。你可以用它来检查 instanceof 操作员或功能 get_class。没什么特别的。 PHP在将其他值转换为object时使用此类。

在许多情况下 stdClass 程序员使用数组是更好的选择,因为有用的函数和这个用例表示数据结构不是真实对象的事实。


6
2018-03-05 10:04





如果您想快速创建一个新对象来保存有关书籍的一些数据。你会做这样的事情:

$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://rads.stackoverflow.com/amzn/click/0439136369";

请检查网站 - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ 更多细节。


3
2017-10-14 10:02