PHP Değişkenler değer veya başvuru geçirilen mı?

oy
174

PHP değişkenleri değer veya başvuru geçirilen mı?

Oluştur 03/08/2008 saat 23:51
kaynak kullanıcı
Diğer dillerde...                            


13 cevaplar

oy
215

Bu uygun değerle bulunuyor PHP Dokümantasyon .

Varsayılan olarak, fonksiyon argümanları değer geçirilir (işlevin içinde argüman değeri değiştiğinde eğer öyleyse, o fonksiyonun dışında değişti etmediğini). Fonksiyonun argümanları değiştirmesine izin vermek için, bunlar, referans ile bu kabul edilmelidir.

Her zaman referans olarak geçirilen bir fonksiyonu için bir bağımsız değişken sahip olmak için, bir işareti (başa eklemek ve işlev tanımında bağımsız değişken adının).

<?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.'
?>
Cevap 04/08/2008 saat 00:06
kaynak kullanıcı

oy
52

Birçok insan nesneleri işlevlerine geçti ve referans yoluyla neyi pas edilir bu arada karıştı görünüyor. Nesne değişkenleri hala değer geçirilir, PHP5 geçirilir onun sadece değer bir 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";

Çıktılar:

a, b

Için , referans ile bu geçiş biz arayan tarafından görülür değişkenleri değiştirmek anlamına gelir. Hangi açıkça Yukarıdaki kod yapmaz. Biz takas işlevini değiştirmek gerekir:

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

Çıktılar:

b, a

amacıyla referans ile bu geçmek için.

Cevap 11/08/2008 saat 03:09
kaynak kullanıcı

oy
37

PHP, varsayılan nesneler tarafından yeni bir nesne için 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 görüyoruz ..............

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 görüyoruz ..............

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.

~ bunu anlayabiliyorum umuyoruz.

Cevap 14/03/2012 saat 07:09
kaynak kullanıcı

oy
24

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

PHP 5'te yeni Nesne Modeli yoktur. Nesnelerin PHP'nin kullanımı tamamen iyi performans ve daha fazla özellik için izin yeniden yazılmıştır. PHP önceki sürümlerinde, nesneler (örneğin tamsayılar ve dizeleri) ilkel türleri gibi ele alınmıştır. Bu yöntemin dezavantajı, semantik olarak bütün bir amacı değişken atandı kopyalanır veya bir yönteme, bir parametre olarak geçirilmiştir oldu. Yeni yaklaşımda, nesneler kolu tarafından başvurulan, değere göre değil, (bir nesnenin tanımlayıcı olarak bir sap düşünebiliriz).

Cevap 04/08/2008 saat 00:57
kaynak kullanıcı

oy
19

PHP değişkenleri değeriyle atanır değeriyle fonksiyonları geçirilir ve içerdiğinde / temsil eden nesneleri referans ile geçirilir. Bir programı kullanılarak, referans ile bu geçmesine değişkenleri zorlayabilir

değeri / referans örnek tarafından atanan:

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

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

çıktılayacaktır

var1: Test, var2: son test, var3: son test

değeri / başvuru exampe tarafından aktarılan:

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

changeThem($var1, $var2);

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

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

çıktılayacaktır:

var1: foo, var2 BAR

Referans exampe tarafından geçirilen değişkenleri Nesne:

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

Misiniz çıkışı:

FOO

(Son örnek muhtemelen daha iyi olabileceğini ...)

Cevap 03/08/2008 saat 23:52
kaynak kullanıcı

oy
7

Sen referans olarak bir işleve bir değişken geçirebilirsiniz. Bu fonksiyon orijinal değişken değiştirmek mümkün olacak.

Sen fonksiyon tanımında referans olarak geçişini tanımlayabilirsiniz:

<?php
function changeValue(&$var)
{
    $var++;
}

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Cevap 21/12/2014 saat 09:27
kaynak kullanıcı

oy
5

Sen bunu iki şekilde yapabilirsiniz.

önünde bir '&' simgesi koymak ve geçiyoruz değişken bir ve onun kökeni ile aynı hale gelir. yani: Bunun yerine bir kopyasını yapmak yerine, referans ile geçebilir.

yani

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Cevap 22/02/2009 saat 10:17
kaynak kullanıcı

oy
4

İlkel türlerini içeren değişkenler PHP5 değer geçirilir. nesneleri içeren değişkenler referans ile geçirilir. Bu ve 4 ile 5 arasında diğer OO farklılıkları bahseder 2006 Linux Journal ilginç bir makale oldukça var.

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

Cevap 04/08/2008 saat 01:05
kaynak kullanıcı

oy
1
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>";

çok dikkat referans ile bu geçmemiş olduğunda özellikler hala değiştirilebilir vardır.

Çıktı:

SwapObjects: b, a SwapValues: a, b

Cevap 11/05/2010 saat 16:51
kaynak kullanıcı

oy
1

Nesneler PHP PHP 5'de ve değerle başvuruya göre iletilir 4. Değişkenler varsayılan olarak değer geçirilir!

Burada okuyun: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

Cevap 09/01/2010 saat 17:34
kaynak kullanıcı

oy
0

sadece orijinal değişken değiştirebilir ve atanan yeni değeri ile aynı değişken adı için yeniden dönmek istediğinizde fonksiyonları için bunu kullanın.

function add(&$var){ // The &amp; 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
Cevap 31/03/2018 saat 12:34
kaynak kullanıcı

oy
0

Aslında her iki yöntem de geçerlidir ancak genellikle referans olarak sizin requirement.Pass değerlerine bağlıdır senaryonuz yavaş yapar. Yani onun daha iyi yürütme zamanı dikkate alarak değeriyle değişkenler geçmek. Eğer değeriyle değişkenleri geçmesi Ayrıca kod akışı daha tutarlıdır.

Cevap 15/07/2015 saat 11:25
kaynak kullanıcı

oy
-6

versiyonuna göre değişir, 4 5, referans ile bu olup, değerdir.

Cevap 03/08/2008 saat 23:52
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more