PHP массив объектов требует от меня клонирования каждого объекта, иначе он сохранит изменения - PullRequest
0 голосов
/ 07 июня 2018

У меня есть класс, который имеет массив объектов.У меня есть функция, которая зацикливается на массиве и форматирует значение, а затем просто помещает эти отформатированные значения в отдельный массив ... и затем возвращает их.

Вот соответствующий код:

<code>class MoneyThing {
    public $taxes = array();

    public function formatTaxes(){
        // Pretend the $taxes array is populated as such when called, with a single LeviedTax object
        //  Array
        //  (
        //      [0] => LeviedTax Object
        //      (
        //          [name] => HST
        //          [rate] => 13
        //          [total] => 17.55
        //          [harmonized] => 1
        //      )
        //  )

        echo "<pre>".print_r($this->taxes, true)."
"; $ formattedTaxes = $ this-> tax; foreach ($ formattedTaxes as $ tax) {// Сделать клон объекта. Объект PHP по умолчанию скопирован в другие переменные по ссылке. // $ tax = clone $ tax; // Просто добавляем знак доллара $ tax-> total = money_format ($ tax-> total); $ formattedTaxes [] = $ tax;} echo "
".print_r($this->taxes, true)."
"; // Напечатаем 'total' долларомзнак. Почему ???: // Array // (// [0] => LeviedTax Object // (// [name] => HST // [rate] => 13 // [total] => $ 17.55 // [harmonized] => 1 //) //) return $ formattedTaxes;}}

Я напечатал массив класса до и после цикла foreach. Я вижу, что массив сохраняет эти изменения,как если бы я сделал их напрямую по ссылке в foreach. Я ожидаю иметь один и тот же массив до и после цикла, поскольку я даже не работаю с указанным array.

Насколько я понимаю, массивы копируются просто и понятно, тогда как объекты копируются по ссылке.Однако, так как я копирую массив объектов, я ожидаю, что не придется использовать клон, потому что это не по ссылке ... верно?

Почему мне нужно раскомментировать $tax = clone $tax;, чтобы на самом деле не сохранятьсяотформатированные значения?

1 Ответ

0 голосов
/ 07 июня 2018

Объекты всегда передаются по ссылке.Технически говоря, массив объектов в PHP - это массив ссылок на объекты.

С точки зрения дизайна вы пытаетесь решить не ту проблему.

Честно говоря, вам не нужен этот метод.Такие вызовы, как money_format(), должны быть реализованы в момент вывода налога, например, когда вы будете интерполировать это в HTML или писать в CSV.

Если вам действительно нужно выводить этот материал несколько раз, напримерВы должны напечатать отформатированную налоговую стоимость в десятки различных форматов файлов, поэтому стоит добавить небольшие накладные расходы в виде свойства formattedTotal класса LeviedTax.В этом случае у вас будет сеттер типа

class LeviedTax {
  public function setTotal($total) {
    $this->total = $total;
    $this->formattedTotal = money_format($total);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...