Доступ к объектам в PHP как в Java - PullRequest
0 голосов
/ 08 мая 2019

Последние несколько месяцев я провел по колено в 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;
}

Так что теперь я могу перебрать варенье и вызвать метод

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, но я не знаю, имеет ли это смысл. Если бы кто-нибудь мог пролить некоторый свет на это, это было бы очень полезно, чтобы помочь моему пониманию того, как язык работает на более глубоком уровне.

(П.С. Я на самом деле не делаю приложение, основанное на Jam, это было бы вкусно)

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Поскольку мне было скучно ждать чего-то, вот отправная точка ( Исполняемая демоверсия ):

//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)
  }
}

Где путаница?

0 голосов
/ 08 мая 2019

Вы можете определить массив объектов, использовать цикл 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...