【问题标题】:Array of PHP ObjectsPHP 对象数组
【发布时间】:2012-01-26 14:02:57
【问题描述】:

所以我一直在寻找一段时间,找不到一个简单问题的答案。是否可以在 PHP 中有一个对象数组?如:

$ar=array();    
$ar[]=$Obj1    
$ar[]=$obj2

由于某种原因,我无法在任何地方找到答案。我认为这是可能的,但我只需要确定。

【问题讨论】:

    标签: php arrays object


    【解决方案1】:

    是的。

    $array[] = new stdClass;
    $array[] = new stdClass;
    
    print_r($array);
    

    结果:

    Array
    (
        [0] => stdClass Object
            (
            )
    
        [1] => stdClass Object
            (
            )
    
    )
    

    【讨论】:

    • 我计时了,测试用了二十秒,包括打字时间。
    • 那么我的类名会替换stdClass吗?如果对象已经创建并且您只想将其添加到数组中怎么办。可以通过上述方法使用构造函数吗? p.s.抱歉,我是新手
    • 它没有什么特别之处。随意添加到数组中。这只是一个演示,您可以非常非常轻松地自己测试这些东西。
    • 这是问题的答案,而接受的答案指向完全不同的 OOPS 方向
    • @ceejayoz 是的,但谷歌这个答案不到 5 秒;)
    【解决方案2】:

    查找诸如此类的一般(以及一些简单的问题)答案的最佳位置是阅读PHP docs。具体而言,您可以在objects 上阅读更多信息。您可以将 stdObject 和实例化对象存储在数组中。实际上,有一个称为“hydration”的过程,它使用数据库行中的值填充对象的成员变量,然后将对象存储在数组中(可能与其他对象一起)并返回给调用代码访问。

    -- 编辑--

    class Car
    {
        public $color;
        public $type;
    }
    
    $myCar = new Car();
    $myCar->color = 'red';
    $myCar->type = 'sedan';
    
    $yourCar = new Car();
    $yourCar->color = 'blue';
    $yourCar->type = 'suv';
    
    $cars = array($myCar, $yourCar);
    
    foreach ($cars as $car) {
        echo 'This car is a ' . $car->color . ' ' . $car->type . "\n";
    }
    

    【讨论】:

    • 我已经尝试了 php 站点,但没有找到任何东西。我还坐在 Matt Zandstra 的《PHP 对象、模式和实践》一书中。并没有找到任何信息。
    • 问题:假设您只想打印该数组中的一个Car 中的color。你会说echo $cars[0]->color; 打印第一个,echo $cars[1]->color; 打印第二个吗?
    • 我只记得有一个很棒的东西叫做 Ideone,它可以让你在线测试代码 sn-ps。回答我自己的问题:是的,您可以:ideone.com/8XB4TC
    • @MikeWarren:正确,这就是为一组对象补水的能力,也就是“集合”。您还可以具体说明每个对象获得的键,以防您需要检索集合中的特定对象,例如 `$car['blue_4_door'] = $anotherCar'。
    • 所以如果我有 20 个对象,我必须输入 20 次 $yourCar = new Car(); ?没有像 let car = [{}, {},{}] 这样的 JS 更优雅的方法了吗?
    【解决方案3】:

    数组可以保存指针,所以当我想要一个对象数组时,我会这样做。

    $a = array();
    $o = new Whatever_Class();
    $a[] = &$o;
    print_r($a);
    

    这将表明该对象已通过数组被引用和访问。

    【讨论】:

      【解决方案4】:

      是的,在 PHP 中可以有对象数组。

      class MyObject {
        private $property;
      
        public function  __construct($property) {
          $this->Property = $property;
        }
      }
      $ListOfObjects[] = new myObject(1); 
      $ListOfObjects[] = new myObject(2); 
      $ListOfObjects[] = new myObject(3); 
      $ListOfObjects[] = new myObject(4); 
      
      print "<pre>";
      print_r($ListOfObjects);
      print "</pre>";
      

      【讨论】:

      • 每次我们想在数组中添加一个新对象时,我们是否必须继续增加 myObject() 中的构造函数索引,或者它是可选的吗?网络语言中的所有这些 OOP 内容简直就是 OOPS!
      • @YoustayIgo 仅用于示例,以便输出将对象彼此区分开来。您可以在构造函数中放置您喜欢的任何值,然后它只需将该值分配给对象的 $property 属性。
      【解决方案5】:

      尽管给出的所有答案都是正确的,但实际上它们并没有完全回答关于使用 [] 构造以及更一般地用对象填充数组的问题。

      更相关的答案可以在 how to build arrays of objects in PHP without specifying an index number? 这清楚地表明了如何解决问题。

      【讨论】:

        【解决方案6】:

        另一个直观的解决方案可能是:

        class Post
        {
            public $title;
            public $date;
        }
        
        $posts = array();
        
        $posts[0] = new Post();
        $posts[0]->title = 'post sample 1';
        $posts[0]->date = '1/1/2021';
        
        $posts[1] = new Post();
        $posts[1]->title = 'post sample 2';
        $posts[1]->date = '2/2/2021';
        
        foreach ($posts as $post) {
          echo 'Post Title:' . $post->title . ' Post Date:' . $post->date . "\n";
        }
        

        【讨论】:

        • 最好的...为我节省了很多时间。不过,这里有一个小调整,而不是做这个增量,只是尝试把它放在一个循环中并使用一个变量来增量。无论是针对单个对象还是数百个对象都没有关系,它看起来会更通用。
        【解决方案7】:

        你可以这样做:

        $posts = array(
          (object) [
            'title' => 'title 1',
            'color' => 'green'
          ],
          (object) [
            'title' => 'title 2',
            'color' => 'yellow'
           ],
           (object) [
             'title' => 'title 3',
             'color' => 'red'
           ]
        );
        

        结果:

        var_dump($posts);
        
        array(3) {
          [0]=>
          object(stdClass)#1 (2) {
            ["title"]=>
            string(7) "title 1"
            ["color"]=>
            string(5) "green"
          }
          [1]=>
          object(stdClass)#2 (2) {
            ["title"]=>
            string(7) "title 2"
            ["color"]=>
            string(6) "yellow"
          }
          [2]=>
          object(stdClass)#3 (2) {
            ["title"]=>
            string(7) "title 3"
            ["color"]=>
            string(3) "red"
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-11-08
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-28
          • 2021-04-14
          相关资源
          最近更新 更多