ChatGPT解决这个技术问题 Extra ChatGPT

PHP中的stdClass是什么?

请定义 stdClass 是什么。


I
IROEGBU

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

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

我不相信 PHP 中有基本对象的概念


这是一个实用类!顺便说一句,这是真正的评论!
实际上,代码片段之后的第一句话回答了这个问题。
+1。另一个导致 Java 的 Object 类和 PHP 的 stdClass 不同的主要因素是动态属性。您不能只在 Java Object 对象中定义动态属性(或变量),但是,您可以在 PHP 中的 stdClass 对象中这样做。
@Miro Markaravanes:动态属性可以分配给 PHP 中的任何类,而不仅仅是 stdClass。
我多么希望有一个可以修改的基类。然后我可以添加一个 stdClass->methods() ,我的生活会更快乐一些。
A
AnthonyB

stdClass 是 PHP 的通用空类,类似于 Java 中的 Object 或 Python 中的 object编辑:,但实际上并未用作通用基类;感谢 @Ciaran< /em> 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


也许他使用了 mysql_fetch_object。如果我没记错的话,它会创建一个 stdlcas 的实例。
它不像 Java 的 Object 那样完全是一个基类,请参阅下面的答案。
我希望你知道 object 不是 Python 中“所有”对象的派生类......至少,直到你被迫从 Python 3.0 中的 object 派生
我认为人们应该说 stdClass 类似于 JavaScript 的 {} 构造。
先生,您的回答部分不正确,因为文章不正确。扩展此类为您提供的唯一(这也是错误的)是输入提示的选项,即 function(StdClass $a, array $params) 与检查 $a 是否为对象和 instanceof
R
Ryan Vincent

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 对象创建一个新的 PageShow 对象。

这里不需要为此编写新的类模板,您可以简单地使用 stdClass 动态创建一个类。

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

具有与行一起使用的有用函数的空类,也是更好的编码标准
这与使用数组相同。事实上,STDclass 是在类型杂耍时生成的,如数组到对象的转换。
请更正代码中的错字: ($this->currentpage->name==1) 应该是 ($this->currentpage->status==1)
“你可以创建一个匿名 PHP 类”——它不是一个匿名类。您可以使用 instanceof、get_class、...
现在这个答案特别令人困惑,因为 PHP actually has anonymous classesstdClass 非常不同。
w
whoan

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


真的。必要时,我经常使用 json_encode 和 json_decode 将数组转换为对象到数组。
$x = json_decode(json_encode($object), True) 会将对象解码为数组,但它不是二进制安全的。本质上,如果它不是纯文本,它可能会在 JSON 中中断。
@simontemplar 在 PHP 中你不应该写 True。布尔值是小写 truefalse
@simontemplar 手册没有,但 PSR-2 有,所以如果您遵循任何类型的标准,它应该是小写的。当然,如果你想这样写它是有效的,但你应该遵循标准。布尔值的手册文档将非常陈旧,可能是在标准形成之前编写的。老实说,PHP 最初是写成一团糟,没有任何标准(请参阅使用的各种变量/函数/对象命名约定)。不过,老实说,我从未见过开发人员使用您的格式的任何 PHP 代码。
我确实遵循 PSR-2,除了 True/False/Null 并将左大括号放在自己的类上。除此之外,我只是不在乎。但是,如果曾经编辑过别人的代码,我会遵循他们使用的任何标准(如果有的话,通常没有),如果我没有这样做,那么以“正确”的方式执行 PSR-2。那里有很多糟糕的代码,还有很多其他问题,三个关键字的大写是我最不担心的。
d
damian

使用 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 以进一步了解。


a
alex

同样地,

$myNewObj->setNewVar = 'newVal'; 

产生一个 stdClass 对象 - 自动转换

我今天通过拼写错误发现了这一点:

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

凉爽的!


但这应该引发 E_NOTICE
@Petah 仅在 PHP 5.3+ 中,对吗?但是,是的,这肯定是不好的做法。
C
Community

stdClass 不是匿名类或匿名对象

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

stdClass 只是一个常规的预定义类。您可以使用 instanceof 运算符或函数 get_class 进行检查。这里没有什么特别的。 PHP 在将其他值转换为对象时使用此类。

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


根据我的经验,stdClass 主要是由于不了解 json_encode() 在 PHP 中的实际工作原理而意外使用的。您可以仅使用(可能是递归的)数组来构建所需的全部数据,json_encode() 将发出数组或对象,具体取决于您在每个数组中是否仅使用数字键或字符串键。如果你真的需要一个类,最好实际定义一个真正的类。 stdClass 在功能上与 class stdClass {} 相同。
s
supersan

我们有 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_encodejson_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(),您可以使用类型转换为(对象),如本答案所示,该答案在技术上会在过程中创建 stdClass,但您不需要在实际源代码中对其进行编码,也不需要关心实际的内部实现细节。简而言之,您永远不需要在 PHP 中自己使用 stdClass
A
Antony

还值得注意的是,通过使用 Casting,您实际上不需要像 @Bandula 给出的答案那样创建对象。相反,您可以简单地将数组转换为对象并返回 stdClass。例如:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again


S
Sage

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

class emp{}

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


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

正在使用的 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"]);

会回声

约翰·多伊


C
Community

php.net 手册有一些用户提供的关于 stdClass 是什么的可靠解释和示例,我特别喜欢这个http://php.net/manual/en/language.oop5.basic.php#92123https://stackoverflow.com/a/1434375/2352773

stdClass 是默认的 PHP 对象。 stdClass 没有属性、方法或父级。它不支持魔术方法,也不实现任何接口。当您将标量或数组转换为 Object 时,您将获得 stdClass 的一个实例。您可以在需要通用对象实例时使用 stdClass。 stdClass 不是基类! PHP 类不会自动从任何类继承。所有类都是独立的,除非它们明确扩展另一个类。 PHP 在这方面不同于许多面向对象的语言。您可以定义一个扩展 stdClass 的类,但您不会得到任何好处,因为 stdClass 什么都不做。


N
Niladri Banerjee - Uttarpara

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

$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/ 了解更多详情。


您是否有任何合理的用例,其中 PHP 数组(技术上是数组和有序哈希图的混合)不能以更高的性能服务于相同的目的?
N
Nasir Nasrallah

避免在必须将某些数据放入类时停止解释脚本的一种方式,但不幸的是,该类未定义

例子 :

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

在这里,数据将被放入预定义的 'Tasks' 中。但是,如果我们这样编写代码:

 return $statement->fetchAll(PDO::FETCH_CLASS );

然后 会将结果放入

只是 说:看,我们有一个很好的 KIDS[Objects] Here 但没有父母。所以,我们会将他们送到婴儿托儿所 :)


C
Christian Lescuyer

请记住,2 个空的 stdClass 并不严格相等。这在编写嘲讽期望时非常重要。

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 >

因为它不是同一个实例,所以它不能彼此相等。类的严格比较与实例识别一起工作。任何类的每个实例都有唯一的 ID。
S
Sherif Eldeeb

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';

是什么让人们考虑使用对象样式而不是数组样式???


V
Vahid Amiri

您还可以使用 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];

第二种方法最适用于初始化具有许多属性的对象。


K
Kiran Maniya

PHP 中的 stdClass 是经典的泛型类。它没有内置的属性或方法。基本上,它用于转换类型,创建具有动态属性的对象等。如果您有 javascript 背景,您可以确定为

$o = new \stdClass();

相当于

const o = {};

它创建空对象,稍后由程序控制流填充。