首页 文章

什么是PHP中的stdClass?

提问于
浏览
933

请定义 stdClass 是什么 .

16 回答

  • 2

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

  • 3

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

    class emp{}
    

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

  • 7

    stdClass 是PHP的通用空类,有点像Java中的 Object 或Python中的 objectEdit: 但实际上并不用作通用基类;感谢@Ciaran为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 .

  • 6

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

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

  • 3

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

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

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

  • 24

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

  • 82

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

  • 2

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

    示例:

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

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

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

    然后php将结果放在stdclass .

    只是php说:看,我们有一个很好的KIDS [对象]这里但没有父母 . 所以,我们会把它们寄给婴幼儿护理院stdclass :)

  • 3

    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"]);
    

    会回应

    John Doe

  • 58

    请记住,2个空stdClasses并不完全相同 . 在撰写 Mock 期望时,这非常重要 .

    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 >
    
  • 21

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

    $array = array(
        'Property1'=>'hello',
        'Property2'=>'world',
        'Property3'=>'again',
    );
    
    $obj = (object) $array;
    echo $obj->Property3;
    

    Output: again

  • 695

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

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

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

  • 1

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

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

  • 2

    同样,

    $myNewObj->setNewVar = 'newVal';
    

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

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

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

    凉!

  • 1067

    stdClass不是匿名类或匿名对象

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

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

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

相关问题