Передаются ли переменные PHP по значению или по ссылке?
Согласно Документации PHP, он имеет значение.
По умолчанию аргументы функций передаются по значению (так что если значение аргумента внутри функции изменяется, оно не изменяется вне функции). Чтобы функция могла изменять свои аргументы, они должны передаваться по ссылке.
Чтобы аргумент функции всегда передавался по ссылке, добавьте амперсанд (&) к имени аргумента в определении функции.
<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>
Кажется, что много людей запутывается способом, которым объекты переданы к функциям и что означает проход ссылкой. Переменные объекта все еще переданы стоимостью, ее просто стоимость, которая передана в PHP5, является справочной ручкой. Как доказательство:
<?php
class Holder {
private $value;
public function __construct($value) {
$this->value = $value;
}
public function getValue() {
return $this->value;
}
}
function swap($x, $y) {
$tmp = $x;
$x = $y;
$y = $tmp;
}
$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);
echo $a->getValue() . ", " . $b->getValue() . "\n";
Продукция:
a, b
К [проходят ссылкой] (http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference) средства, мы можем изменить переменные, которые замечены посетителем. Который ясно выше не делает кодекс. Мы должны изменить функцию обмена на:
<?php
function swap(&$x, &$y) {
$tmp = $x;
$x = $y;
$y = $tmp;
}
$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);
echo $a->getValue() . ", " . $b->getValue() . "\n";
Продукция:
b, a
чтобы пройти ссылкой.
В PHP, объектами по умолчанию переданы как справочная копия к новому Объекту.
Посмотрите этот пример.............
class X {
var $abc = 10;
}
class Y {
var $abc = 20;
function changeValue($obj)
{
$obj->abc = 30;
}
}
$x = new X();
$y = new Y();
echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 30
Теперь посмотрите это..............
class X {
var $abc = 10;
}
class Y {
var $abc = 20;
function changeValue($obj)
{
$obj = new Y();
}
}
$x = new X();
$y = new Y();
echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 10 not 20 same as java does.
Теперь посмотрите это..............
class X {
var $abc = 10;
}
class Y {
var $abc = 20;
function changeValue(&$obj)
{
$obj = new Y();
}
}
$x = new X();
$y = new Y();
echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 20 not possible in java.
я надеюсь, что Вы можете понять это.
< http://www.php.net/manual/en/migration5.oop.php>
В PHP 5 есть новая Модель Объекта. PHP' s обработка объектов был полностью переписан, допуская лучшую работу и больше особенностей. В предыдущих версиях PHP объекты были обработаны как примитивные типы (например, целые числа и последовательности). Недостаток этого метода состоял в том, что семантически целый объект был скопирован, когда переменная была назначена или прошла в качестве параметра к методу. В новом подходе на объекты ссылается ручка, а не стоимостью (можно думать о ручке как о object' s идентификатор).
Переменные PHP присваиваются по значению, передаются в функции по значению, а когда содержат/представляют объекты, то передаются по ссылке. Вы можете заставить переменные передаваться по ссылке с помощью &
Пример присвоения по значению/ссылке:
$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";
print ("var1: $var1, var2: $var2, var3: $var3);
выведет
var1: тест, var2: финальный тест, var3: финальный тест
Передано по значению / ссылочный пример:
$var1 = "foo";
$var2 = "bar";
changeThem($var1, $var2);
print "var1: $var1, var2: $var2";
function changeThem($var1, &$var2){
$var1 = "FOO";
$var2 = "BAR";
}
выведет:
var1: foo, var2 BAR
Объектные переменные, передаваемые по ссылке пример:
class Foo{
public $var1;
function __construct(){
$this->var1 = "foo";
}
public function printFoo(){
print $this->var1;
}
}
$foo = new Foo();
changeFoo($foo);
$foo->printFoo();
function changeFoo($foo){
$foo->var1 = "FOO";
}
Будет выведено:
FOO
(последний пример может быть лучше, вероятно...)
Вы можете передать переменную к функции ссылкой. Эта функция будет в состоянии изменить оригинальную переменную.
Вы можете определить проход ссылкой в определении функции:
<?php
function changeValue(&$var)
{
$var++;
}
$result=5;
changeValue($result);
echo $result; // $result is 6 here
?>
Вы можете сделать это так или иначе.
поместите ' & ' символ впереди и переменная, которую Вы передаете, становятся одними и теми же как свое происхождение. т.е.: Вы можете пройти ссылкой, вместо того, чтобы делать копию из него.
так
$fred = 5;
$larry = & $fred;
$larry = 8;
echo $fred;//this will output 8, as larry and fred are now the same reference.
Переменные, содержащие примитивные типы, переданы стоимостью в PHP5. Переменные, содержащие объекты, переданы ссылкой. There' s вполне интересная статья из Журнала Linux с 2006, который упоминает это и другие различия OO между 4 и 5.
Объекты переданы ссылкой в PHP 5 и стоимостью в PHP 4. Переменные переданы стоимостью по умолчанию!
Читать здесь: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
class Holder
{
private $value;
public function __construct( $value )
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
public function setValue( $value )
{
return $this->value = $value;
}
}
class Swap
{
public function SwapObjects( Holder $x, Holder $y )
{
$tmp = $x;
$x = $y;
$y = $tmp;
}
public function SwapValues( Holder $x, Holder $y )
{
$tmp = $x->getValue();
$x->setValue($y->getValue());
$y->setValue($tmp);
}
}
$a1 = new Holder('a');
$b1 = new Holder('b');
$a2 = new Holder('a');
$b2 = new Holder('b');
Swap::SwapValues($a1, $b1);
Swap::SwapObjects($a2, $b2);
echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>";
echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";
Признаки все еще модифицируемые если не переданные ссылкой, так остерегайтесь.
Продукция:
SwapObjects: b, a SwapValues: a, b
Используйте это для функций, когда Вы будете хотеть просто изменить оригинальную переменную и возвратить ее снова к тому же имени переменной с его новой назначенной стоимостью.
function add(&$var){ // The & is before the argument $var
$var++;
}
$a = 1;
$b = 10;
add($a);
echo "a is $a,";
add($b);
echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced
На самом деле оба, методы действительны, но это зависит от Вашего требования. Ценности прохода ссылкой часто делают Ваш сценарий медленным. Так лучше, чтобы передать переменные стоимостью, рассматривая время выполнения. Также кодовый поток более последователен, когда Вы передаете переменные стоимостью.
Зависит от версии, 4 - по значению, 5 - по ссылке.