Вопрос

Я готовлюсь к сертификации Zend PHP5, все выглядит хорошо, но я не могу найти реальные примеры передачи или возврата переменных по моей ссылке.

Было бы очень здорово, если бы у кого-нибудь был пример, когда это можно использовать?

Это было полезно?

Решение

Допустим, вы хотите написать функцию, которая удаляет определенные значения из массива.

function remove_elements($array, $item1, $item2, ...) {
  ...
}

Вы можете скопировать массив и вернуть его.Но что, если вы хотите знать, было ли что-то удалено?Вместо этого вы изменяете массив на месте и верните количество удаленных элементов.Так:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

Если вы создаете сложную структуру внутри своей функции, вы можете захотеть вернуть ссылку на нее, а не ее копию.Но это довольно маргинальный случай, поскольку PHP использует копирование при записи (т.е. он не копируется до тех пор, пока не будет изменен), но есть несколько допустимых вариантов использования.

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

Наконец, стоит отметить, что по умолчанию все объекты передаются и возвращаются по ссылке.Все остальное передается и возвращается по значению.

Другие советы

Пройти по ссылке:такие функции, как сортировать()

$array = array(3, 2, 1);
asort($array);

По умолчанию объекты в php5 передаются по ссылке.(Правильное описание см. http://docs.php.net/language.oop5.references)

На передачу аргументов по ссылке уже был дан ответ...

В качестве (реального) примера возвращаемого значения по ссылке выберите любой свободный интерфейс где метод возвращает ссылку на тот же объект, что и его собственный контекст вызова ($this).Это не сработало бы (как и ожидалось), если бы возвращаемое значение было копией/клоном.

Например.

class MyClass {  
  protected $foo = 'n/a';
  protected $bar = 'n/a';

  function foo($val) {
    $this->foo = (int)$val;
    return $this;
  }

  function bar($val) {
    $this->bar = (int)$val;
    return $this;
  }

  function __toString() {
    return 'foo='.$this->foo.' bar='.$this->bar;
  }
}

$o = new MyClass;
$o->foo(1)
  ->bar(2);
echo $o;

Это печатает foo=1 bar=2 и я думаю, что это именно тот результат, которого можно было ожидать, здесь нет никаких сюрпризов.Если бы метод возвращал $this по значению, он больше не работал бы.Вы можете проверить это, заставив php вернуть копию.Вместо return $this линии используют

return clone $this;

и результат будет

foo=1 bar=n/a

(и я бы не назвал этот интерфейс интуитивно понятным ;-))

Это может быть полезно, если вы работаете с цепочкой, например:

    public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}

....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();

...Сорри.То же, что и Волкерс :( (Fluent Interface представляет собой цепочку, как я это знаю).

Изображение: у вас есть свободный интерфейс с методом загрузки.Load-интерфейс заменяет или добавляет некоторые данные.Здесь может быть полезно действовать вызовом по ссылочному значению $success, чтобы определить, что загрузка прошла успешно.

Возврат по ссылке:Возьмите несколько объектов базы данных, имеющих список строк.Номерстрок указывает на правильные данные всех объектов (параллельно).Если вы вернете номер.и передать его следующему объекту, вы можете пропустить строку в одном объекте и пропустить и другие.Всегда иметь кучу валидных объектов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top