문제

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

에게 참조로 전달 이는 호출자가 보는 변수를 수정할 수 있음을 의미합니다.위의 코드는 분명히 그렇지 않습니다.스왑 기능을 다음과 같이 변경해야 합니다.

<?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의 객체 처리가 완전히 다시 작성되어 더 나은 성능과 더 많은 기능이 가능해졌습니다.이전 버전의 PHP에서는 객체가 기본 유형(예: 정수 및 문자열)처럼 처리되었습니다.이 방법의 단점은 의미상 변수가 할당되거나 매개변수로 메서드에 전달될 때 전체 개체가 복사된다는 것입니다.새로운 접근 방식에서는 객체가 값이 아닌 핸들로 참조됩니다(핸들을 객체의 식별자로 생각할 수 있음).

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 바

참조 예시에 의해 전달된 객체 변수:

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

다음과 같이 출력됩니다.

(마지막 예가 더 좋을 수도 있습니다...)

참조를 통해 변수를 함수에 전달할 수 있습니다.이 함수는 원래 변수를 수정할 수 있습니다.

함수 정의에서 참조로 구절을 정의할 수 있습니다.

<?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에서 값으로 전달됩니다.객체를 포함하는 변수는 참조로 전달됩니다.2006년 Linux Journal에는 이것과 4와 5 사이의 다른 OO 차이점을 언급하는 매우 흥미로운 기사가 ​​있습니다.

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

객체는 PHP 5에서는 참조로 전달되고 PHP 4에서는 값으로 전달됩니다.변수는 기본적으로 값으로 전달됩니다!

여기를 읽어보세요: http://www.webeks.net/programming/php/ampersand-operator-used-for-signing-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>";

참조로 전달되지 않은 경우에도 속성은 여전히 ​​수정 가능하므로 주의하세요.

산출:

SwapObject:B, A SWAPVALUES :에, 비

실제로 두 방법 모두 유효하지만 요구 사항에 따라 다릅니다. 값을 참조로 전달하면 스크립트 속도가 느려지는 경우가 많습니다.따라서 실행 시간을 고려하여 변수를 값으로 전달하는 것이 좋습니다.또한 변수를 값으로 전달할 때 코드 흐름이 더욱 일관됩니다.

단순히 원래 변수를 변경하고 새 값이 할당된 동일한 변수 이름으로 다시 반환하려는 경우 함수에 이 기능을 사용합니다.

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

버전에 따라 4는 값 기준, 5는 참조 기준입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top