Sind PHP-Variablen nach Wert oder Verweis übergeben?

stimmen
174

Sind PHP-Variablen nach Wert oder Verweis übergeben?

Veröffentlicht am 03/08/2008 um 23:51
quelle vom benutzer
In anderen Sprachen...                            


13 antworten

stimmen
215

Es ist von Wert entsprechend der PHP - Dokumentation .

In der Standardeinstellung Funktionsargumente von Wert übergeben werden (so, dass, wenn der Wert des Arguments innerhalb der Funktion geändert wird, ist es nicht außerhalb der Funktion geändert werden). Damit eine Funktion ihrer Argumente zu ändern, müssen sie als Referenz übergeben werden.

Um ein Argument einer Funktion immer als Referenz übergeben, prepend ein kaufmännisches ( & ) mit dem Argument Name in der Funktionsdefinition.

<?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.'
?>
Beantwortet am 04/08/2008 um 00:06
quelle vom benutzer

stimmen
52

Es scheint eine Menge Leute, die übrigens verwirren lassen Objekte auf Funktionen und was Pass von Referenzmittel übergeben werden. Objektvariablen werden immer noch von Wert übergeben, es ist nur der Wert, der in PHP5 übergeben wird, ist ein Referenzhandgriff. Als Beweis dafür:

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

Ausgänge:

a, b

Um über einen Verweis bedeutet , wir können die Variablen ändern , die von dem Anrufer zu sehen ist. Was eindeutig der obige Code nicht tut. Wir müssen die Swap - Funktion ändern:

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

Ausgänge:

b, a

um durch Bezugnahme passieren.

Beantwortet am 11/08/2008 um 03:09
quelle vom benutzer

stimmen
37

In PHP standardmäßig Objekte werden als Referenzkopie auf ein neues Objekt übergeben.

Sehen Sie dieses Beispiel .............

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

Jetzt sehen diese ..............

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.

Jetzt sehen diese ..............

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.

Ich hoffe, dass Sie das verstehen können.

Beantwortet am 14/03/2012 um 07:09
quelle vom benutzer

stimmen
24

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

In PHP 5 gibt es ein neues Objektmodell. PHP Handhabung von Objekten wurde komplett neu geschrieben, so dass für eine bessere Leistung und mehr Funktionen. In früheren Versionen von PHP, wurden Objekte wie primitive Typen (zum Beispiel ganze Zahlen und Strings) behandelt. Der Nachteil dieses Verfahrens war, dass das gesamte Objekt semantisch kopiert wurde, wenn eine Variable zugewiesen wurde, oder als Parameter an eine Methode übergeben. In dem neuen Ansatz werden die Objekte durch den Griff Bezug genommen wird, und nicht durch den Wert (man kann als ein Objekt der Kennung eines Griffs denken).

Beantwortet am 04/08/2008 um 00:57
quelle vom benutzer

stimmen
19

PHP Variablen Wert zugeordnet ist, weitergeleitet zu Funktionen, die von Wert ist, und wenn enthält / repräsentierten Aufgaben werden gelöst durch Referenz übergeben. Sie können Variablen erzwingen, indem Verweis übergeben mit einem &

Zugewiesen Wert / Referenzbeispiel:

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

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

ausgeben würde,

var1: test, var2: Endprüfung, var3: Endprüfung

Vergangen Wert / Referenz exampe:

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

changeThem($var1, $var2);

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

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

ausgeben würde:

var1: foo, BAR var2

Objekt-Variablen als Referenz exampe geben:

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

Würde Ausgabe:

FOO

(Das letzte Beispiel wahrscheinlich besser sein könnte ...)

Beantwortet am 03/08/2008 um 23:52
quelle vom benutzer

stimmen
7

Sie können eine Variable auf eine Funktion als Verweis übergeben. Diese Funktion wird in der Lage, die ursprüngliche Variable zu ändern.

Sie können die Passage durch Verweis in der Funktionsdefinition definieren:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Beantwortet am 21/12/2014 um 09:27
quelle vom benutzer

stimmen
5

Sie können es so oder so tun.

setzen ein ‚&‘ Symbol vor und die Variable, die Sie vorbei sind wird ein und dasselbe wie seine Herkunft. dh: Sie können durch Verweis übergeben, anstatt eine Kopie davon zu machen.

damit

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Beantwortet am 22/02/2009 um 10:17
quelle vom benutzer

stimmen
4

Variablen enthalten primitive Typen werden von Wert in PHP5 übergeben. Variablen enthalten Objekte werden als Referenz übergeben. Es ist durchaus ein interessanter Artikel von Linux Journal aus dem Jahr 2006, die diese und andere OO Unterschiede zwischen 4 und 5 erwähnt.

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

Beantwortet am 04/08/2008 um 01:05
quelle vom benutzer

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

Attribute sind noch änderbar, wenn sie nicht durch einen Verweis übergeben, also passen.

Ausgabe:

SwapObjects: b, a SwapValues: a, b

Beantwortet am 11/05/2010 um 16:51
quelle vom benutzer

stimmen
1

Objekte als Referenz übergeben werden in PHP 5 und durch einen Wert in PHP 4. Variablen werden durch einen Wert standardmäßig bestanden!

Lesen Sie hier: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

Beantwortet am 09/01/2010 um 17:34
quelle vom benutzer

stimmen
0

Verwenden Sie diese für Funktionen, wenn Sie möchten, einfach die ursprüngliche Variable ändern und senden Sie sie wieder auf die gleichen Variablennamen mit dem neuen Wert zugewiesen.

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
Beantwortet am 31/03/2018 um 12:34
quelle vom benutzer

stimmen
0

Eigentlich sind beide Methoden gültig, aber es hängt von Ihren requirement.Pass Werten von Referenz oft macht Sie Skript langsam. So ist es besser, Variablen nach Wert übergeben, indem Zeitpunkt der Ausführung berücksichtigen. Auch der Code Fluss ist konsequenter, wenn Sie Variablen als Wert übergeben.

Beantwortet am 15/07/2015 um 11:25
quelle vom benutzer

stimmen
-6

Abhängig von der Version 4 von Wert, 5 durch Referenz.

Beantwortet am 03/08/2008 um 23:52
quelle vom benutzer

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