Değer veya başvuru tarafından geçirilen PHP Değişkenler?

11 Cevap php

Değer veya başvuru tarafından geçirilen PHP değişkenleri var?

11 Cevap

Bu PHP Documentation göre değer tarafından bulunuyor.

(Fonksiyonu içinde argümanın değeri değiştirilirse, bu fonksiyon dışında değiştirilemez almaz böylece) Varsayılan olarak, fonksiyon argümanları değer geçirilir. Fonksiyonun argümanları değiştirmek için izin vermek için, onlar referans olarak kabul edilmelidir.

Her zaman referans olarak geçirilen bir işleve bir argüman var, işlev tanımında değişken adı bir ve işareti (&) Önlerine.

<?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.'
?>

Bu bir sürü insan nesneleri işlevlerine geçirilen yol ve referans yoluyla ne pas ile karışık görünüyor. Nesne değişkenleri hala değer geçirilir, PHP5 geçirilen onun sadece değeri referans kolu olduğunu. Kanıt olarak:

<?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";

Çıkışlar:

a b

pass by reference biz arayan tarafından görülen değişkenleri değiştirmek anlamına gelir için. Açıkça yukarıda kod yapmaz ki. Biz takas işlevini değiştirmek gerekir:

<?php
function swap(&$x, &$y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

referans ile bu geçmek için.

@ Karl

PHP5 değişkenler varsayılan değer geçirilir ve nesnelerine başvuru tarafından geçirilen varsayılan olarak.

Ya isteğe & operatörü kullanılarak referans kabul edilebilir.

Eğer bir referans geçmek bile Ancak, çoğu yaşlı PHP fonksiyonları ilkel değiştirmez ...

$str = "hello world";

echo $str; // hello world
echo strrev($str); // dlrow olleh

strrev( &$str ); // ! Warning is issued
echo $str; // hello world

$str = strrev($str);
echo $str; // dlrow olleh

Eğer bir referans olarak bir değer geçmek için çalışın eğer bir uyarı atmak olacaktır. Bu değer veya referans üzerinde çalışmaya karar işlevi kalmıştır.

http://www.php.net/manual/en/migration5.oop.php

PHP 5 yeni Nesne Modeli var. Nesnelerin PHP'nin kullanımı tamamen daha iyi performans ve daha fazla özellik için izin, yeniden yazılmıştır. PHP'nin önceki sürümlerinde, nesneleri (örneğin tamsayılar ve yaylılar için) ilkel türleri gibi ele alınmıştır. Bu yöntemin dezavantajı değişken atanmış veya bir yönteme bir parametre olarak kabul edildiğinde semantik bütün nesne kopyalanmış olmasıydı. Yeni yaklaşımda, nesneler tanıtıcı tarafından başvurulan ve değerine göre (tek bir nesnenin tanımlayıcı olarak bir sap düşünebilirsiniz) değil.

PHP, varsayılan nesneler ile yeni bir nesne için bir referans kopya olarak geçirilir.

Bu örneğe bakın .............

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

Şimdi bu bkz ..............

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.

Şimdi bu bkz ..............

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.

i bu anlayabiliyorum umuyoruz.

Temsil eden / içeren nesnelerine başvuru tarafından geçirilen zaman PHP değişkenleri değeri tarafından işlevlere geçirilen değeri tarafından atanan, ve vardır. Bir & kullanarak referansla geçmek için değişkenleri zorlayabilir

Değeri / referans örnek atanır:

$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";

print ("var1: $var1, var2: $var2, var3: $var3);

would çıktı "var1: test, var2'ye: nihai test, değ3: nihai test".

Değeri / referans exampe geçti:

$var1 = "foo";
$var2 = "bar";

changeThem($var1, $var2);

print "var1: $var1, var2: $var2";

function changeThem($var1, &$var2){
    $var1 = "FOO";
    $var2 = "BAR";
}

"var1: foo, var2'ye BAR" çıkışı olur.

Referans exampe geçti nesne değişkenleri:

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";
}

"FAN": çıktı Would

(Bu son örnek ... muhtemelen daha iyi olabilir)

Bunu iki şekilde yapabilirsiniz.

a 've' koymak önünde sembolü ve geçiyoruz değişken bir ve kökeni gibi aynı olur. yani: Bunun yerine bir kopyasını yapmak yerine, referans ile iletebilirsiniz.

bu yüzden

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.

Ilkel türleri içeren değişkenler PHP5'ta değeri tarafından geçirilir. Nesneleri içeren değişkenler başvuruya göre iletilir. Bu ve 4 ve 5 arasında diğer OO farklılıkları bahseder 2006 Linux Journal oldukça ilginç bir makale var.

http://www.linuxjournal.com/article/9170

Objects are passed by reference in PHP 5 and by value in PHP 4. Variables are passed by value by default!

Burada okuyun: 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>";

Yani sakının başvuru tarafından geçirilen zaman değil Özellikler hala değiştirilebilir vardır.

Çıktı:

SwapObjects: b, a SwapValues: a, b

Sürümüne bağlıdır, 4 5 referans olan, değeri gereğidir.