Резюме
Я пытаюсь найти способ изменить ссылочную переменную на два уровня вверх, избегая при этом Deprecated: Call-time pass-by-reference has been deprecated
Исследования, которые я сделал
Я просмотрел это и this, и кажется, что call_user_func_array
может отключить предупреждение, однако я думаю, что что-то упускаю.
Проблема
Я использую MongoDB с PHP, следующий метод принадлежит модели и просто проверяет схему ввода, которая передается в нее по ссылке, перед ее сохранением.
// $this->collection is the MongoCollection object
public function save(&$entry) {
if( empty($entry) ) return false;
if( !$this->checkSchema($entry) ) $this->throwDbError('Schema violation in `' . get_class($this) . '`');
try { return $this->collection->save(&$entry); } // <---- want to avoid using &
catch (Exception $e) { return $this->throwDbError($e); }
}
MongoCollection::save ($this->collection->save)
добавит поле _id
к $entry
с новым идентификатором документа. Однако это изменение не отражается на $entry
, который передается в вышеприведенный метод, если только я не передам ему время вызова по ссылке. (По сути, я хочу, чтобы MongoCollection::save
мог изменять $entry
на два уровня выше)
Хорошо, это мой лучший способ объяснить проблему, дайте мне знать, если вам нужны разъяснения.
&
и нажмите «Удалить». Серьёзно, в php5 смысла нет. Вы можете только указать, что переменная должна передаваться как ссылка только в объявлении функции. - person zerkms   schedule 12.10.2012$entry
должен быть объектом. Либо так, либо помните, что методы могут иметь возвращаемое значение;) - person KingCrunch   schedule 12.10.2012save()
, а не дляinsert()
- person zerkms   schedule 12.10.2012insert()
должно работать. - person zerkms   schedule 12.10.2012$collection->insert($a); var_dump($a['_id']);
- person zerkms   schedule 12.10.2012