PHP对象数组

89

我已经搜索了一段时间,但找不到一个简单问题的答案。在PHP中是否可以有一个对象数组?例如:

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

由于某些原因,我无法在任何地方找到答案。 我认为它是可能的,但我只需要确保一下。

7个回答

137

要找到关于一般(而且相对简单)问题的答案,最好的地方是阅读PHP文档。特别是在你的情况下,你可以阅读更多关于对象的内容。你可以将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";
}

9
我尝试了那个PHP网站,但没有找到任何信息。我现在正在阅读Matt Zandstra的《PHP对象、模式和实践》一书,但也没有找到任何信息。 - Beamer180
3
假设你想要打印出数组中一个车的颜色,你会这样说吗:echo $cars[0]->color; 打印第一个车的颜色,而 echo $cars[1]->color; 则是打印第二个车的颜色? - Mike Warren
1
我刚想起来有一个很好的东西叫做 Ideone,可以在线测试代码片段。回答我的问题:是的,你可以在 http://ideone.com/8XB4TC 上测试。 - Mike Warren
2
@MikeWarren:正确,这就是为什么给对象数组进行水合作用(也称为“集合”)的强大之处。您还可以具体指定每个对象获得的键,以便在集合中检索特定对象,例如`$car['blue_4_door'] = $anotherCar'。 - Mike Purcell
1
那么如果我有20个对象,我需要输入20次 $yourCar = new Car(); 吗? 是否有更优雅的方法来做到这一点,就像JS中的 let car = [{}, {},{}] 一样? - Mario Nezmah

31

是的。

$array[] = new stdClass;
$array[] = new stdClass;

print_r($array);

结果是:

Array
(
    [0] => stdClass Object
        (
        )

    [1] => stdClass Object
        (
        )

)

7
我计时了,测试用了20秒,包括打字时间。 - ceejayoz
那么我的类名会替换stdClass吗?如果对象已经创建,您想将其添加到数组中怎么办?可以在上述方法中使用构造函数吗?附言:抱歉我是SO的新手。 - Beamer180
3
没什么特别的。按你喜欢的方式将其添加到数组中即可。这只是一个演示,表明你可以非常容易地自行测试这些东西。 - ceejayoz
2
这是问题的答案,而最佳答案指向了完全不同的OOPS方向。 - Clain Dsilva
1
@ceejayoz 是的,但是谷歌这个答案不到5秒钟就可以搞定 ;) - Chuck Le Butt

18

你可以像这样做:

$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"
  }
}

11

是的,在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()中的构造函数索引吗?还是这是可选的?所有这些Web语言中的面向对象编程都是“糟糕透了”! - Youstay Igo
@YoustayIgo 这只是一个例子,这样输出可以区分各个对象。你可以在构造函数中放入任何值,它只是将该值分配给对象的$property属性。 - ADyson

7

数组可以持有指针,所以当我需要一个对象数组时,我这样做。

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

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

5

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

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";
}

1
最好的...省了我很多时间。这里有一个小调整,不要使用增量,而是尝试将其放入循环中,并使用变量进行增量。无论是单个对象还是数百个对象都可以,这样看起来更通用。 - deejay

0
尽管所有给出的答案都是正确的,但实际上它们并没有完全回答这个问题,这个问题是关于使用[]结构和更一般地用对象填充数组。
一个更相关的答案可以在如何在PHP中构建对象数组而不指定索引号码?中找到,它清楚地展示了如何解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接