提问



请定义stdClass是什么。

最佳参考


stdClass是PHP的通用空类,有点像Java中的Object或Python中的object(但实际上并没有用作通用基类;感谢 @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中的动态属性。[40]

其它参考1


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


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


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

其它参考2


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();

其它参考3


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

其它参考4


同样,


$myNewObj->setNewVar = 'newVal'; 


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


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


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


凉!

其它参考5


使用 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文档中的此示例以进一步理解。[41]

其它参考6


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


class emp{}


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

其它参考7


stdClass不是匿名类或匿名对象



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


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


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

其它参考8


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


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

其它参考9


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



  stdClass是默认的PHP对象。 stdClass没有属性,
  方法或父。它不支持魔术方法和实现
  没有接口。

  
  当您将标量或数组转换为Object时,您将获得一个实例
  stdClass的。只要需要通用对象,就可以使用stdClass
  实例。

  
  stdClass不是基类! PHP类不会自动继承
  从任何一个班级。除非明确说明,否则所有类都是独立的
  扩展另一个班级。 PHP与许多面向对象语言不同
  在这方面。

  
  你可以定义一个扩展stdClass的类,但是你会得到no
  好处,因为stdClass什么都不做。


其它参考10


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


会回应



  约翰·多伊


其它参考11


stClass是一个由php本身创建的空类,应该只由php使用,
因为它不仅仅是一个空类,
php使用stdClass将数组转换为对象样式
如果你需要使用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';


是什么让人想到使用对象样式而不是数组样式?

其它参考12


stdclass是一种方法,当有些数据必须放在类中时,php避免停止解释脚本,但是
不幸的是,这个班级没有定义/questions/tagged/stdclass /questions/tagged/php


示例:


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


这里的数据将放在预定义的任务中。但是,如果我们这样做了代码:


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


那么php会把结果放在stdclass中。/questions/tagged/php /questions/tagged/stdclass


只是php说:看,我们有一个很好的KIDS [[对象]]这里但没有父。所以,我们会将它们发送给婴儿护理之家stdclass :) /questions/tagged/php /questions/tagged/stdclass

其它参考13


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


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

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


Output: again

其它参考14


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


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

其它参考15


请记住,2个空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 >