[php] PHP 변수는 값이나 참조로 전달됩니까?

PHP 변수는 값 또는 참조로 전달됩니까?



답변

PHP Documentation 에 따르면 가치가 있습니다.

기본적으로 함수 인수는 값으로 전달됩니다 (따라서 함수 내의 인수 값이 변경되면 함수 외부에서는 변경되지 않습니다). 함수가 인수를 수정할 수있게하려면 참조로 전달해야합니다.

함수에 대한 인수가 항상 참조로 전달되도록 하려면 함수 정의에서 인수 이름 앞에 앰퍼샌드 ( & )를 추가하십시오.

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


답변

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.

나는 당신이 이것을 이해할 수 있기를 바랍니다.


답변

객체가 함수에 전달되는 방식과 참조가 전달하는 방식에 의해 많은 사람들이 혼란스러워하는 것 같습니다. 객체 변수는 여전히 값으로 전달되며, 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

참조로 전달하기 위해.


답변

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.