programing

PHP에서 "=&" 및 "=" 연산자는 무엇을 의미합니까?

bestcode 2022. 9. 26. 23:05
반응형

PHP에서 "=&" 및 "=" 연산자는 무엇을 의미합니까?

PHP에서 "=&" / "&=" 연산자는 무엇을 의미합니까?그들에 대한 정보는 어디서 읽을 수 있나요?

구글 검색은 도움이 되지 않는다.

$a &= $b 말하다$a = $a & $b비트 앤 연산자입니다.

$a =& $b는 $a를 $b에 대한 참조로 할당합니다.

=&

$a =& $b$a합니다.$b의 값 $a 경우,이가 바뀌게 됩니다.$b그에 따라 변화합니다.

이것은 오브젝트에 관한 "둘 다 같은 장소를 가리키고 있다"와는 다릅니다. 수 있다$c = $d = new AnObject(두 변수 모두 동일한 위치를 가리킵니다. 그러나 한 점을 변경해도 다른 점이 변경되지 않습니다.그것은,$c = null 수 없다$d = null$a =& $b , 지,,$a = null would $b = null.

주의: 공식적으로 에일리어스는 참조라고 불립니다.공식 용어가 좀 잘못된 용어이고 분명 애매하기 때문에 대신 "에일리어스"라는 용어를 사용하기로 했습니다.메뉴얼에 대해서는, php.net 를 참조해 주세요.

용도 및 효과

값에서는, 「」를 합니다.=&개체로 값을 감싸는 것과 비슷하므로 여러 변수 간에 값을 전체적으로 변경할 수 있습니다.으로 참조(객체, 「」(객체)는,=&을 사용하다

저는 자주 쓰는 편이에요.=&어소시에이티브 어레이로 작업할 때 사용합니다. 쓰는 것이 $foo['bar']['foobar'] 수 .$foobar =& $foo['bar']['foobar']이러한 기능은 지수가 아직 존재하지 않는 경우에도 작동합니다. if$foo['bar']['foobar']하지 않습니다.그러면, 「존재하지 않습니다」라고 하는 것입니다.isset($foobar)거짓이 될 것이다.에러를 트리거하지 않고 키의 존재를 테스트하기 전에 에일리어스를 작성할 수 있기 때문에 일반 오래된 변수를 사용하는 것보다 좋습니다.

설정 해제해 ( 「 」 「」unset($foobar)않으면 나중에 이름을 것이 그렇지 않으면 나중에 변수 이름을 재사용하면 별칭이 가리키는 모든 항목을 덮어쓰게 됩니다.

별칭은 할당에 국한되지 않고 다른 방법으로도 사용할 수 있습니다.다음과 같은 기능을 합니다.

  • 루프: " " " "foreach ($a as &$b)$b는, 대응하는 .$a (설정되지 않음)$b안 그러면 이상한 문제에 부딪힐 거야!
  • function function/parameters "는 다음과 같습니다.function foobar(&$a)$a의 범위 내에서foobar는, 가 건네준 를 「변수」로 합니다.$a.
  • "/return: "/return: "function &foobar()반환되는 것은 모두 발신자가 변경할 수 있습니다.이는 에일리어스를 전달할 때 도움이 됩니다.그것은 또한 남용하기 쉽다.
  • 어레이:$a = array(&$b)에 대한 변경 사항$a[0]영향을 주다$b(할당 포함)
  • call_user_func_array:call_user_func('foobar', array(&$a))가정하다foobar단일 에일리어스 파라미터를 사용합니다.foobar수정할 수 있게 되었습니다.$a이를 통해 에일리어스 파라미터를 사용하여 함수/메서드를 호출할 수 있습니다.call_user_func_array.

스칼라

$original = 1;
$copy = $original;
$reference =& $original;
// All three variables == 1.

$reference = 2;
// $original == 2, $reference == 2, $copy == 1

$original = 3;
// $original == 3, $reference == 3, $copy == 1

$copy = 4;
// $original == 3, $reference == 3, $copy == 4

물건들

#!/usr/bin/env php
<?php
class Object
{
        private $properties;

        public function __construct(array $properties = array())
        {
                $this->properties = $properties;
        }

        public function __isset($key)
        {
                return isset($this->properties[$key]);
        }

        public function __unset($key)
        {
                unset($this->properties[$key]);
        }

        public function __get($key)
        {
                return isset($this->$key) ? $this->properties[$key] : null;
        }

        public function __set($key, $value)
        {
                $this->properties[$key] = $value;
        }

        public function __toString()
        {
                return print_r($this->properties, true);
        }
}

function print_vars()
{
        global $original, $ref, $refref;

        echo
                '$original: ', $original,
                '$ref: ', $ref,
                '$refref: ', $refref,
                PHP_EOL;
}

$original = new Object(array('a' => 1, 'b' => 2, 'c' => 3));
$ref = $original;
$refref =& $original;
print_vars();
/*
$original: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
$ref: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
$refref: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
*/

$original->a = 'duck';
$ref->b = 'moose';
$refref->c = 'cow';
print_vars();
/*
$original: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
$ref: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
$refref: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
*/

// This carries over to $refref, but not $ref.
$original = new Object(array('x' => 1, 'y' => 2, 'z' => 3));
print_vars();
/*
$original: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
$ref: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
$refref: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
 */

// This does *not* carry over to $original or $ref.
$ref = new Object(array('o' => 42, 'm' => 123, 'n' => 1337));
print_vars();
/*
$original: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
$ref: Array
(
    [o] => 42
    [m] => 123
    [n] => 1337
)
$refref: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
*/

// This *does* carry over to $original, but not $ref.
$refref = new Object(array('alpha' => 10, 'beta' => 20, 'gamma' => 30));
print_vars();
/*
$original: Array
(
    [alpha] => 10
    [beta] => 20
    [gamma] => 30
)
$ref: Array
(
    [o] => 42
    [m] => 123
    [n] => 1337
)
$refref: Array
(
    [alpha] => 10
    [beta] => 20
    [gamma] => 30
)
*/
?>

&=

&=와는 무관하다=&일련의 할당 작업으로부터 얻을 수 있습니다.다음은 몇 가지 예입니다.

  • +=
  • -=
  • *=
  • /=

트렌드가 보이시나요?

이진 산술 연산자에는 일반적으로 할당 연산자가 있습니다.예를 들어@산술 연산자(글쓰기와는 다르다)였다.$a @ $b일반적으로는 일 때 수치를 산출한다.$a그리고.$b(생각: 덧셈, 곱셈, 나눗셈 등)이런 일을 얼마나 자주 해야 하나요?

$a = $a @ $b;

꽤 자주.반복할 필요가 없어 보이지 않나요?$aPHP를 포함한 많은 언어들이 할당 연산자의 배열로 이 문제를 해결합니다.

$a @= $b;

훨씬 단순하고 이 표기법에 익숙한 프로그래머에게는 한 눈에 보다 간결하고 설명적인 표현일 수 있습니다.(익숙하니까 확실히 읽기 쉬워요.)변수를 이중으로 만들려면:

$a *= 2;

빠르고, 쉽고, 비교적 알기 쉬운 기술입니다.PHP를 포함한 일부 언어에서는 추가 연산을 위해 이 기능을 산술 이상으로 확장합니다.특히:

$a = $a . 'Appended text';
// Is the same as:
$a .= 'Appended text';

매우 편리합니다.

&=이러한 할당 연산자에 속합니다.이유는 다음과 같습니다.&는 비트 연산 AND 연산을 나타냅니다.PHP 문서에는 다른 몇 가지 목록이 있습니다(상기 링크 참조). 이 모든 것은 많은 프로그래밍 언어에서 공통적입니다.

즉,$a &= $b와 같다$a = $a & $b.

언급URL : https://stackoverflow.com/questions/1367454/what-do-the-and-operators-in-php-mean

반응형