PHP 변수는 값으로 전달되나요, 아니면 참조로 전달되나요?
PHP 문서]1에 따라 값을 기준으로 합니다.
기본적으로 함수 인수는 값으로 전달됩니다(따라서 함수 내에서 인수의 값이 변경되더라도 함수 외부에서는 변경되지 않습니다). 함수가 인수를 수정할 수 있도록 하려면 인수를 참조로 전달해야 합니다.
함수에 대한 인수를 항상 참조로 전달하려면 함수 정의에서 인수 이름 앞에 앰퍼샌드(&)를 추가합니다.
<?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.'
?>
많은 사람들이 혼란을 가져올 수 있을 것 같다, 어떤 방식을 통해 전달되는 객체에는 참조별로 전달하십시오 기능을 한다. 아직도 그 가치를 전달하는 전달되는 값을 com/go/4e6b330a_kr 객체에는 그냥 PHP 5 에서 참조입니다 적다. 대비성 있다.
<?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
[전달하십시오 참조별로] 를 (http://en.wikipedia.org/wiki/Pass_by_reference # Call_by_reference) 에서 볼 수 있는 장점도 com/go/4e6b330a_kr 수정하십시오 요청자에게. 위 코드를 변경할 필요가 있는 확실히요 게하여 스왑이란 기능을 수행하지 않습니다.
<?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
처리하기 위해 참조별로.
기본적으로 새 객체를 사본이라는 참조로 개체를 미리 전달됩니다.
이 슬라이드에서는 예.
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 에서 좁히어 는 새로운 객체 모델. # 39 의 객체에는 php& 처리 할 수 있도록 더 나은 성능과 더 많은 기능을 완전히 다시 작성되었습니다. 이전 버전의 PHP, 객체에는 처리됩니까 프리미티브 유형 (예를 들어, 정수 및 문자열) 같은 것이다. 이 방법을 단점이 있는 것은 의미, 또는 통과될 경우 전체 객체에는 복제되었습니다 가변적입니다 할당된 매개 변수로 메서드입니다. 새로운 외곽진입 객체는 참조됨 처리하십니까 부서가 아닌 밸류급 (# 39 의 식별자입니다 object& 표시됨과 핸들을 한 생각해 볼 수 있다).
PHP 변수는 값으로 할당되고, 값으로 함수에 전달되며, 객체를 포함/표현하는 경우 참조로 전달됩니다. 변수를 강제로 참조로 전달하려면 &
값/참조로 할당 예제:
$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";
print ("var1: $var1, var2: $var2, var3: $var3);
는 다음과 같이 출력됩니다.
var1: test, var2: final test, var3: final test
값/참조로 전달된 예시입니다:
$var1 = "foo";
$var2 = "bar";
changeThem($var1, $var2);
print "var1: $var1, var2: $var2";
function changeThem($var1, &$var2){
$var1 = "FOO";
$var2 = "BAR";
}
가 출력됩니다:
var1: foo, var2 BAR
참조로 전달된 객체 변수 예시:
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";
}
가 출력됩니다:
FOO
(마지막 예제가 더 나을 수도 있습니다...)
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>";
그래서 아직 전달되지 않은 참조별로 수정가능으로 속성뿐 때 주의해야 합니다.
출력:
스와포비치스: b, a 스와프발 주: a, b
이 기능을 사용할 때 다시 원래 변수를 변경하십시오 프로파일링하려는 앨리어스가 다시 같은 변수 이름 색상에는 새로운 가치를 배정됩니다.
function add(&$var){ // The & 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