什么是PHP中的stdClass?

Kei*_*hly 1014 php stdclass

请定义什么stdClass是.

Cia*_*lty 1100

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

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

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

  • 标准=标准 - (46认同)
  • 实际上,代码片段后面的第一句话回答了这个问题. (16认同)
  • 什么是std代表什么? (3认同)
  • 这是一个实用类!顺便说一句,这是真正的评论! (2认同)
  • @Miro Markaravanes:动态属性可以分配给PHP中的任何类,而不仅仅是stdClass. (2认同)

Ale*_*lli 762

stdClass是PHP的通用空类,有点像ObjectJava或objectPython(编辑:但实际上并没有用作通用基类;感谢@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
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请参阅PHP和StdClass中的动态属性.

  • 它不像Java的Object那样是一个基类,请参阅下面的答案. (66认同)
  • 我想人们应该说stdClass就像JavaScript的`{}`结构. (11认同)
  • 也许他使用了mysql_fetch_object.如果我没有弄错的话,会创建一个stdlcass实例. (7认同)
  • @Ciaran,你是对的,相应地编辑我的答案. (3认同)

Mri*_*hal 94

stdClass是另一个很棒的PHP功能.您可以创建一个匿名PHP类.让我们看一个例子.

$page=new stdClass();
$page->name='Home';
$page->status=1;
Run Code Online (Sandbox Code Playgroud)

现在认为你有另一个类将使用页面对象进行初始化并在其上执行.

<?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';
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您必须使用Page Object创建一个新的PageShow对象.

这里不需要为此编写新的类模板,您只需使用stdClass即可创建一个类.

    $pageview=new PageShow($page);
    $pageview->show();
Run Code Online (Sandbox Code Playgroud)

  • "你可以创建一个匿名的PHP类" - __这不是一个匿名的class__.你可以使用instanceof,get_class,...... (7认同)
  • 一个空类,包含有用的函数,可以处理行,也是一个更好的编码标准 (3认同)
  • 由于[PHP实际上具有匿名类](http://php.net/manual/en/language.oop5.anonymous.php),这个答案尤其令人困惑,它与`stdClass`完全不同。 (2认同)

小智 59

另外值得注意的是,stdClass也可以使用对象创建对象json_decode().

  • $ x = json_decode(json_encode($ object),True)会将对象解码为数组,但它不是二进制安全的.基本上如果它不是明文,它可能会破坏JSON. (6认同)
  • 真正.在必要时,我经常使用json_encode和json_decode将数组转换为对象到数组. (5认同)
  • @simontemplar手册没有,但[PSR-2](http://www.php-fig.org/psr/psr-2/)确实如此,所以如果您遵循任何标准,它应该在小写.当然,如果你想以这种方式写它是_valid_但你应该遵循标准.布尔值的手册文档将非常陈旧,可能在标准形成之前编写.说实话,PHP最初是在没有任何标准的情况下编写的完整混乱(参见广泛使用的变量/函数/对象命名约定).老实说,我从未见过开发人员使用过您的格式的任何PHP代码. (2认同)
  • 除了True / False / Null之外,我确实遵循PSR-2,并在类的自己行上加上了开括号。除此之外,我不在乎。但是,如果曾经编辑别人的代码,我会遵循他们正在使用的任何标准(如果有的话,通常是没有),如果我做不到,请以“正确”的方式进行PSR-2。我有很多麻烦的代码,还有很多其他问题,三个关键字的大写字母是我最不用担心的。 (2认同)

Ban*_*asa 26

使用stdClass,您可以使用它自己的属性创建一个新对象.请考虑以下示例,该示例将用户的详细信息表示为关联数组.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
Run Code Online (Sandbox Code Playgroud)

如果需要表示与对象属性相同的详细信息,可以使用stdClass,如下所示.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
Run Code Online (Sandbox Code Playgroud)

如果您是Joomla开发人员,请参阅Joomla文档中的此示例以进一步了解.


小智 24

同样,

$myNewObj->setNewVar = 'newVal'; 
Run Code Online (Sandbox Code Playgroud)

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

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

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Run Code Online (Sandbox Code Playgroud)

凉!

  • 但这应该引发E_NOTICE (9认同)
  • @Petah仅在PHP 5.3+中虽然对吗?但是,这肯定是不好的做法. (3认同)

Joh*_*ith 13

stdClass不是匿名类或匿名对象

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

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

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


Sag*_*age 7

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

class emp{}
Run Code Online (Sandbox Code Playgroud)

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

  • 嗯...过早优化.如果我真的关心速度而不是花费600微秒的时间,我宁愿找到复杂的SQL查询或其他网络瓶颈.实际上,我宁愿首先检查javascript是否在页脚上而不是在头部,而不是小心,如果一个比另一个快600微秒. (27认同)
  • 显然,差异是由名称长度的差异引起的.如果你把这个类称为"averylongclassnamefornoapparentreason",那么创建它将花费更长的时间.所以去看看. (22认同)
  • 1000对于可靠的基准来说太小了.尝试十亿. (6认同)

sup*_*san 7

我们有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)
Run Code Online (Sandbox Code Playgroud)

假设您想对变量 $c 进行 JSON 编码

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}
Run Code Online (Sandbox Code Playgroud)

现在假设您删除了所有键,$b使其为空。因为$b现在是空的(你删除了所有的键还记得吗?),[]如果你看它,它看起来可以是一个数组或对象。

所以如果你再做一个json_encode,输出会不一样

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}
Run Code Online (Sandbox Code Playgroud)

这是一个问题,因为我们知道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)
Run Code Online (Sandbox Code Playgroud)

因此,现在即使您从中删除所有键$b并将其设为空,由于它是 stdClass 也无关紧要,当您对它进行 json_encode 时,您会得到以下信息:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
Run Code Online (Sandbox Code Playgroud)

这也是为什么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
Run Code Online (Sandbox Code Playgroud)


小智 6

请记住,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 >
Run Code Online (Sandbox Code Playgroud)


Nil*_*ara 5

如果要快速创建一个新对象来保存有关书籍的某些数据。您将执行以下操作:

$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/";
Run Code Online (Sandbox Code Playgroud)

请访问该网站-http: //www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/了解更多详细信息。


Dan*_*jel 5

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 什么都不做。


Dev*_*vWL 5

使用中的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"]);
Run Code Online (Sandbox Code Playgroud)

会回声

约翰·杜


小智 5

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

例子 :

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');
Run Code Online (Sandbox Code Playgroud)

在这里,数据将放在预定义的 'Tasks' 中。但是,如果我们按照以下方式执行代码:

 return $statement->fetchAll(PDO::FETCH_CLASS );
Run Code Online (Sandbox Code Playgroud)

然后会将结果放在

简单的说:看,我们有一个很好的 KIDS[Objects] 在这里但没有Parents。所以,我们会把他们送到婴儿托儿所标准:)


Ant*_*ony 5

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

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

$obj = (object) $array;
echo $obj->Property3;
Run Code Online (Sandbox Code Playgroud)

Output: again