Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 객체 비교 연산자: ==와 ===의 차이점 완벽 이해하기

개요

PHP에서는 객체 변수를 비교할 때 두 가지 연산자를 사용할 수 있습니다. 먼저 ==(동등 연산자)는 두 객체 변수를 단순 비교하는 데 사용되며, 두 객체가 같은 클래스에 속하고 대응되는 속성(property)들의 값이 모두 동일하면 true를 반환합니다.

반면 ===(일치 연산자)는 두 객체 변수가 정확히 같은 클래스의 동일한 인스턴스(instance)를 참조하는 경우에만, 즉 그 경우에 한해서만 true를 반환합니다.

이번 글에서는 아래 두 개의 클래스를 사용하여 이 연산자들이 객체를 어떻게 비교하는지 살펴보겠습니다.

예제용 클래스 정의

<?php
class test1 {
    private $x;
    private $y;
    function __construct($arg1, $arg2) {
        $this->x = $arg1;
        $this->y = $arg2;
    }
}
class test2 {
    private $x;
    private $y;
    function __construct($arg1, $arg2) {
        $this->x = $arg1;
        $this->y = $arg2;
    }
}
?>

케이스 1: 같은 클래스의 서로 다른 두 객체

같은 클래스로부터 생성했지만 각각 독립적으로 만들어진 두 객체를 비교해 보겠습니다.

$a = new test1(10, 20);
$b = new test1(10, 20);
echo "같은 클래스의 두 객체\n";
echo "== 연산자 사용 : ";
var_dump($a == $b);
echo "=== 연산자 사용 : ";
var_dump($a === $b);

실행 결과

같은 클래스의 두 객체
== 연산자 사용 : bool(true)
=== 연산자 사용 : bool(false)

두 객체는 같은 클래스이고 속성 값도 동일하므로 == 비교에서는 true가 나옵니다. 하지만 서로 다른 인스턴스이기 때문에 === 비교에서는 false가 반환됩니다.

케이스 2: 같은 객체를 참조하는 두 변수

이번에는 하나의 객체를 다른 변수에 할당하여, 두 변수가 동일한 인스턴스를 가리키도록 만든 후 비교해 보겠습니다.

$a = new test1(10, 20);
$c = $a;
echo "같은 객체를 참조하는 두 변수\n";
echo "== 연산자 사용 : ";
var_dump($a == $c);
echo "=== 연산자 사용 : ";
var_dump($a === $c);

실행 결과

같은 객체를 참조하는 두 변수
== 연산자 사용 : bool(true)
=== 연산자 사용 : bool(true)

변수 $c$a와 같은 객체 인스턴스를 참조하므로, ===== 모두 true를 반환합니다.

케이스 3: 서로 다른 클래스의 두 객체

속성 구조와 생성자가 완전히 동일하더라도 클래스 자체가 다르면 어떻게 되는지 확인해 보겠습니다.

$a = new test1(10, 20);
$d = new test2(10, 20);
echo "다른 클래스의 두 객체\n";
echo "== 연산자 사용 : ";
var_dump($a == $d);
echo "=== 연산자 사용 : ";
var_dump($a === $d);

실행 결과

다른 클래스의 두 객체
== 연산자 사용 : bool(false)
=== 연산자 사용 : bool(false)

test1test2는 내부 구조가 같아 보여도 서로 다른 클래스이므로, 두 연산자 모두 false를 반환합니다.

정리

  • == 연산자: 두 객체가 같은 클래스의 인스턴스이고, 모든 속성 값이 동일하면 true
  • === 연산자: 두 변수가 같은 클래스의 동일한 인스턴스를 참조할 때만 true
  • 클래스가 다르면 속성 값이 같더라도 두 연산자 모두 false

객체의 값만 비교할지, 객체의 정체성(identity)까지 비교할지에 따라 적절한 연산자를 선택하는 것이 중요합니다.