PHP 对象数组
Posted
技术标签:
【中文标题】PHP 对象数组【英文标题】:Array of PHP Objects 【发布时间】:2012-01-26 14:02:57 【问题描述】:所以我一直在寻找一段时间,找不到一个简单问题的答案。是否可以在 php 中有一个对象数组?如:
$ar=array();
$ar[]=$Obj1
$ar[]=$obj2
由于某种原因,我无法在任何地方找到答案。我认为这是可能的,但我只需要确定。
【问题讨论】:
【参考方案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"
【讨论】:
以上是关于PHP 对象数组的主要内容,如果未能解决你的问题,请参考以下文章