PHP: альтернатива переменным, переданным по ссылке? - PullRequest
0 голосов
/ 15 декабря 2009

За считанные минуты встреча разработчиков php6 я натолкнулся на мысль, что в PHP6 больше нет ссылки на время вызова по ссылке. Например, следующие оба являются неправильными для PHP6:

<?php
$foo =& new StdClass();
?>

<?php
function &foo()
{
    return new StdClass();
}

$f = foo();
?>

Если мы не можем использовать что-то подобное в PHP6:

$foo =& new StdClass();

Какая альтернатива этому, есть ли способ подражать этому?

EDIT:

Что касается переменных в PHP6, можем ли мы сделать это для переменных, например:

$this->data =& $_SESSION;

Ответы [ 3 ]

4 голосов
/ 15 декабря 2009

Объекты всегда передаются по ссылке начиная с PHP5, так что:

$foo =& new StdClass();

совпадает с:

$foo = new StdClass();

.

4 голосов
/ 15 декабря 2009

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

т.е. вы этого не делаете (передача параметров по ссылке) :

my_function(& $my_var);

function my_function($a) {
    // ...
}

Но вы можете сделать это (объявив функцию как получающую параметры по ссылке) :

my_function($my_var);

function my_function(& $a) {
    // ...
}


И ... Приведенные вами примеры кода не относятся к обратному вызову по ссылке , но относятся к возврату по ссылке .

Во-вторых, что если вы просто удалите &? Экземпляр объекта, который был создан внутри функции, будет возвращен, и вы все равно сможете с ним работать, не так ли?

1 голос
/ 15 декабря 2009

А как насчет переменных в PHP6, можем ли мы сделать это для переменных, например: $this->data =& $_SESSION;

Я не вижу причин, почему нет - PHP не будет удалять ссылки, так как они слишком полезны. Нет другого способа создать ссылку на переменную.

Передача по ссылке в течение некоторого времени устарела. Это просто означает, что вместо этого:

function foo($a) { return ++$a; }
foo(&$my_a);

Вы бы сделали это:

function foo(&$a) { return ++$a; }
foo($my_a);

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

Особый случай имеет дело с объектами - они всегда передаются по ссылке, и единственный способ имитировать передачу по значению - использовать clone:

$a = new StdClass();
$a->foo = 'bar';
$b = $a;
$a->foo = 'qux';
// $b->foo is 'qux' too

$a = new StdClass();
$a->foo = 'bar';
$b = clone $a;
$a->foo = 'qux';
// $a->foo is 'qux' but $b->foo is 'bar'

Надеюсь, это поможет!

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