PHP 5 |Объекты, переданные по ссылке / значению против копирования при записи |Когда добавлено как свойство класса - PullRequest
1 голос
/ 10 мая 2019
class MyClass {
    // data going in
    private $in;
    // data going out
    public $out;
    // constructor
    public function __construct($obj0, $obj1) {
        $this->in = array('obj0' => $obj0, 'obj1' => $obj1);
        $this->out = array();
    }
    // method
    public function process() {
        foreach ($this->in as $key => $value) {
            $this->out[$key] = $value;
        }
    }        
}

ПРЕДВАРИТЕЛЬНОЕ ЗНАНИЕ

  1. По умолчанию объекты передаются по ссылке, но существуют крайние варианты
  2. PHP использует копирование при записи

ВОПРОС

  1. Теперь я удваиваю использование памяти, так как у меня есть объекты в MyClass->inи MyClass->out?
  2. Если я использую метод obj0 или obj1, принудительно ли я копирую копию при записи, даже если она не меняет значения свойств этих объектов?
  3. Передается ли объект по ссылке при добавлении в качестве свойства класса?

1 Ответ

1 голос
/ 10 мая 2019

Как говорит страница руководства, на которую вы ссылаетесь, утверждение "объекты передаются по ссылке" не является хорошим описанием того, что происходит. Лучший способ думать об этом - это то, что «значение» объекта - это дескриптор, указатель или адрес чего-то, что существует в другом пространстве.

Независимо от того, назначаете ли вы его свойству объекта, элементу массива или обычной переменной, это «значение» остается неизменным, и изменения объекта видны везде, где вы на них смотрите. Копирование значения использует несколько байтов (размер указателя), но не дублирует память самого объекта.

В качестве окончательного пояснения, «запись» в «копировании при записи» относится к модификации существующего значения, после копирования его из одного места в другое. Таким образом, запись $foo = $bar, где $bar - массив, будет не дублировать память, используемую массивом, но впоследствии запись $foo[0]=1; или $bar[0]=1 будет, поскольку необходимо различать две копии , Это на самом деле не входит в игру в вашем примере; в противном случае это был бы просто «указатель объекта», который был скопирован, поэтому потребовалось бы совсем немного дополнительной памяти.

...