【问题标题】:How to create an array with objects in php如何在php中创建包含对象的数组
【发布时间】:2019-04-22 08:11:42
【问题描述】:

我想要一个包含对象的数组。例如。

public $aCarObjects = array();
$aCars = array('Audi','BMW','Ford');

foreach($aCars as $car){
  array_push($aCarObjects, new Car($car));
}

// Simplified class
class Car implements C{
   private $carName;

  public function __construct($carName){
     $this->carName = $carName;
  } 
}
interface C {}

这是我正在尝试的一个非常简短的版本。 Car 类包含有关汽车的一些信息。

当我在 Car 类中使用 Interface C 时。我无法将对象添加到数组中。为什么呢?

【问题讨论】:

  • 我找到了一些可能对你有帮助的东西 -> clik 即使是同一个例子
  • 是的,您可以在 array_push 中使用“new”。简写版本(只是更简单的语法)是 $aCarObjects[] = new Car($car);
  • 你的代码有问题吗?有什么没有按预期工作吗?
  • @Jeff array_push$array[] 不同 - 在大多数情况下它只做同样的事情
  • 使用现代语法:$array[] 替换 array_push($array) 至少 4 年!看到很痛

标签: php arrays oop object


【解决方案1】:

这个错误与数组无关,它是一个类提升错误(功能?),通过将你的类定义移动到new Car 的调用上方来修复它。显然,PHP does not hoist class definitions if they implement an interface

这是该现象的一个最小示例。

作品:

new Foo();
class Foo {}
interface Bar {} 

没有:

new Foo(); # <-- error: Class 'Foo' not found
class Foo implements Bar {}
interface Bar {} 

也许这是PHP Sadness的候选人?

这是您的代码的工作版本,它还解决了第 1 行中的流浪 public 关键字:

interface C {}

class Car implements C {
    private $carName;

    public function __construct($carName) {
        $this->carName = $carName;
    }
}

$aCarObjects = [];
$aCars = ['Audi', 'BMW', 'Ford'];

foreach ($aCars as $car) {
    array_push($aCarObjects, new Car($car));
}

print_r($aCarObjects);

输出:

Array
(
    [0] => Car Object
        (
            [carName:Car:private] => Audi
        )

    [1] => Car Object
        (
            [carName:Car:private] => BMW
        )

    [2] => Car Object
        (
            [carName:Car:private] => Ford
        )

)

Try it!

【讨论】:

  • 感谢您的评论。构造部分是一个错字,其他事情很高兴知道。我的问题是界面,我没有提到。
  • 问题是你在调用new Car 之后声明了这个类。将类定义移动到文件顶部;如果它实现了一个接口,它就不会被提升,这很奇怪。
  • 真的是这样!非常感谢所有的答案!
猜你喜欢
  • 2010-12-31
  • 2022-07-06
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多