【问题标题】:Accessing objects in PHP like in Java像在 Java 中一样访问 PHP 中的对象
【发布时间】:2019-05-08 19:22:31
【问题描述】:

在过去的几个月里,我一直在深入研究 Java,而我只是重新访问了 PHP。在 Java 中,我可以创建一个对象数组并像这样访问方法:

Jam jam = new Jam(1,"strawberry","December","false");
//creates an object with an id, a flavour, a useby and an opened status

所以如果我循环创建一些堵塞,我可能会有一个类似的数组

[0] => [id => 1,"stawberry"... etc
[1] => [id => 2, "raspberry"... etc]

现在我的果酱模型可能有类似的方法

update_opened(bool newStatus) {
   this.openedStatus = newStatus;
}

所以现在我可以遍历我的 Jam 并调用该方法

for(...size of array) {
    if(i == 1) {
       array.get(i).update_opened(true);
    }

}

现在我的果酱被打开了。我可以在我的应用程序周围传递这个对象,并在我需要/需要时访问该方法

在 PHP 中这似乎不会发生。我似乎每次都需要重新创建一组新对象,例如:

array_map(function($j) use ($jams) {
     $j = new jam(....);
     if($j->id == 1) $j->updateOpenedStatus(true);
     return $jams[$j->id] = $j;
     },
$jams);

我应该这样做还是我的对象应该保持原样?我想知道这是否是因为 Java 是一种编译语言,而不仅仅是一种像 PHP 这样的简单运行时风格,但我不知道这是否有意义。如果有人能对此有所了解,那将非常有用,可以帮助我更深入地了解该语言的工作原理。

(P.S. 我不是真的在做基于 Jam 的应用程序,那会很好吃)

【问题讨论】:

  • 我不知道,jam 类是什么,它有 id 吗?它是否设置在某个地方?在您的函数中,您尝试使用 $locations$l$ul 这些来自哪里???
  • 另外,您传入$j,但随后将$j 定义为新的jam,而您use($jams) 却从未实际使用它。也许是你正在尝试做的项目符号列表。
  • @AbraCadaver - 是的,抱歉,我正在做一个现实生活中的问题广告,试图将其变成一个通用示例,但遗漏了一些参考资料。我的问题并不是关于函数本身以及是否正确分配等等 - 发布的代码是演示性的 - 关键是,在 java 中我可以创建一个对象一次,然后将它传递到一个数组中,然后使用该对象方法,但我不似乎无法在 php 中执行此操作。与其说是代码,不如说是关于 php 对象与 java 对象的理论应用
  • @AbraCadaver 简而言之,这确实是我的观点“此外,您传入 $j 但随后将 $j 定义为新果酱”
  • 对此有何后续行动?

标签: java php oop object


【解决方案1】:

因为我在等待某事感到无聊,所以这是一个起点 (Executable Demo):

//define the jam class
class jam {
    public $id;
    public $flavour;
    public $useby;
    public $openedStatus;

    public function __construct($id, $flavour, $useby, $openedStatus) {
        $this->id = $id;
        $this->flavour = $flavour;
        $this->useby = $useby;
        $this->openedStatus = $openedStatus;
    }

    public function updateOpenedStatus($newStatus) {
        $this->openedStatus = $newStatus;
    }

}

//create an array of objects with different properties
$jams[] = new jam(1, "strawberry", "december", false);
$jams[] = new jam(2, "raspberry", "november", false);

//loop the array and change the first object
foreach($jams as $jam) {
    if($jam->id == 1) {
       $jam->updateOpenedStatus(true);
    }
}

var_dump($jams);

这会产生(注意第一个带有id=1 的对象反映了新的openedStatus=true):

array(2) {
  [0]=>
  object(jam)#1 (4) {
    ["id"]=>
    int(1)
    ["flavour"]=>
    string(9) "stawberry"
    ["useby"]=>
    string(8) "december"
    ["openedStatus"]=>
    bool(true)
  }
  [1]=>
  object(jam)#2 (4) {
    ["id"]=>
    int(2)
    ["flavour"]=>
    string(9) "raspberry"
    ["useby"]=>
    string(8) "november"
    ["openedStatus"]=>
    bool(false)
  }
}

混乱在哪里?

【讨论】:

  • 谢谢 - 没有混淆,这是我所期望的,但是当我将对象放入数组并稍后尝试访问它们时,我的对象不允许我访问它们。因为我在任何我想检查的地方都没有收到任何错误,所以我没有误解我正在尝试做的事情并尝试在 PHP 中使用 Java 结构。感谢您的帮助
【解决方案2】:

您可以定义一个对象数组,使用foreach 循环并在集合中的每个对象上调用该方法。与 Java 没有区别。

$jams = array();
$jams[] = new Jam(1, "strawberry","December",false);
$jams[] = new Jam(2, "raspberry", "January", true);

foreach($jams as $jam){
    if($jam->id == 1)
        $jam->updateOpenedStatus(true);
}

【讨论】:

  • $j 应该是$jam
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2018-06-11
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多