Где я должен использовать оператор & в PHP? - PullRequest
0 голосов
/ 18 ноября 2009

Несколько лет назад я работал с PHP, и в PHP было много изменений, особенно в части ООП.

Тогда было необходимо использовать оператор & в нескольких местах, особенно при работе с экземплярами объектов (тогда ООП был очень элементарен), чтобы избежать копирования экземпляров объектов.

С PHP 5.2, кажется, есть много улучшений по сравнению с 4.0, и я немного запутался.

Когда мне нужно использовать оператор & в PHP, чтобы избежать неприятных сюрпризов с точки зрения Java-программиста?

Примеры:

$a = (&)new MyClass();    //Necessary?

function factoryMethod() {
  $a = (&)new MyClass();  //Necessary?
  return (&) $a;          //Necessary?
}

// Other cases?!

РЕДАКТИРОВАТЬ: Случайно мои примеры вообще не нуждаются в операторе &. Но где мне это нужно?

Ответы [ 4 ]

5 голосов
/ 18 ноября 2009

Короче говоря: нигде в ваших примерах.

В случае, если мы имеем дело с objects, вам вовсе не обязательно использовать справочный оператор .

Если вы имеете дело с другими типами данных, наиболее распространенными ссылочными операциями являются:

Передача по ссылке

function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here

Возвращение ссылок

class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue; // prints the new value of $obj->value, i.e. 2.

Цикл с foreach

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element

Будьте осторожны, так как последний unset() -колл важен, если ваш код снова использует $value ниже по течению.

В то время как первый случай (с передачей по ссылке) встречается гораздо чаще, чем второй, например, особенно при работе с массивами:

$array = array(1, 2, 3, 4);
function modifyArray(&$data)
{
    unset($data[1]);
}
modifyArrax($array);
// $array = array(0 => 1, 2 => 3, 3 => 4)
4 голосов
/ 18 ноября 2009

Как правило, никогда не используйте оператор &, если он вам не нужен (и старайтесь не требовать его). Ни одному из ваших примеров это не нужно.

Все объекты в PHP передаются по ссылке. Если вы сделаете это:

$arr = range(1,4);
func($arr);

function func($arr) {
  unset($arr[3]);
}

это не изменит исходный массив, но изменит его на это:

function func(&$arr) {
  unset($arr[3]);
}

и так будет. Тогда как с объектами:

class A { public $b; }

$a = new A;
$a->b = 3;
func($a);
echo $a->b; // 5

function func($a) {
  $a->b = 5;
}

Все остальное копируется при записи.

Итак, два обстоятельства, при которых вы иногда будете использовать оператор &:

  1. Об аргументах функции, передаваемых по ссылке не-объекту; и
  2. В цикле для изменения массива.

Пример (2):

$arr = range(1,4);
foreach ($arr as &$v) {
  $v += 10;
}

Без & $arr не будет изменено.

2 голосов
/ 18 ноября 2009

В PHP 5 вам не нужно использовать оператор & в любом месте, которое вы показали в своем примере.

0 голосов
/ 18 ноября 2009

Я не знаю правильный ответ ... Но вы можете взглянуть на руководство по php5 об oop. Его можно найти здесь: http://nl2.php.net/manual/en/language.oop5.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...