제가 PHP를 설치했습니다 5.2 제 테스트 컴퓨터의 오늘과 이전 버전에서 잘 작동 코드의 비트의 몇 5.1.6 새 버전의 치명적인 에러를 던졌다. 오류 메시지는 "너무 깊이 중첩 수준 - 순환 의존성?"그리고 그것은 약간 시간이 걸렸습니다
PHP에서는 두 개의 비교 연산자가 있습니다, ==와 ===. 이것은 일반적으로 알려진 최초의 유형에 대한 엄격한지만, 두 번째는 아니됩니다. 그래서, 예를 들면
메아리 ( 거짓 == 0 ); // 사실
메아리 ( 거짓 === 0 ); // 거짓
- 0 정수과 거짓은 부울입니다
내 문제는 개체가 아닌 엄격한 타이핑을 사용에서 비롯.
$= 새로운 MyObj();
$B = 새로운 MyObj();
면( $== $ B )
…
나는 내가이 코드로 뭘하고 있었는데 고려하지 않았. 비교했을 때 두 개의 개체가 아닌 엄격한 비교 연산자를 사용하여 (==) PHP는 만약 그들이 개체를 일치 동등한 것으로 간주되는 개체의 모든 속성을 비교합니다. 그들은 그들이 동등하지 않습니다 일치하지 않는 경우. 효과 있음, 우리는 각 개체의 모든 속성이 재귀 비교, 그리고 그들의 속성, 등등. 우리는 문자열과 정수 같은 기본 데이터 형식을 도달할 때까지.
면, 그러나, 우리는 엄격한 비교를 사용하여 (===), PHP는 두 개체가 똑같은 개체를 확인합니다, 동일한 특성을 가진 개체가 아니라.
클래스하여 MyObj
{
$ 공개 피;
}$= 새로운 MyObj();
$B = 새로운 MyObj();
$C = 새로운 MyObj();
$->피 = 1;
$B ->피 = 1;
$C ->피 = 2;
메아리 ( $== $ C ); // 거짓
메아리 ( $== $ B ); // 사실
메아리 ( $=== $ B ); // 거짓
당신은 당신의 개체 속성에서 순환 참조가있을 경우 문제가 발생. 그래서, 예를 들면
클래스하여 MyObj
{
$ 공개 피;
}
수업 OtherObj
{
$ q를 공개;
}$= 새로운 MyObj();
$B = 새로운 OtherObj();
$->피 = $ b에;
$B ->q를 = $; // 순환 참조: $->P ->=== 달러 q를$C = 새로운 MyObj();
$D = 새로운 OtherObj();
$C ->피 = $ d 개;
$D ->q를 = $ C;// 또 다른 순환 참조: $C ->P ->q를 === $ C메아리 ( $== $ C ); // 치명적인 오류:
수준을 너무 깊게 둥지를 튼 – 순환 종속성?
위해서는 달러에 $ c는 비교, PHP는 그들의 속성을 비교해야합니다. PHP에서 로직 간다 그래서 이런 일이: $== $ C $ 경우 A ->p == $c->P 경우 $ A ->p->Q == $ C ->p->Q 경우 $ A -&gP == $ C -q->p ==P -c->p->Q ->피 등. 무기한.
PHP 5.1 이 문제를 어떻게든 해결해주 듯 (재귀의 그것은 단순히 false를 반환 일정 수준 아마 후에) – 그리고 대개 괜찮PHP는동. PHP 5.2 정확하게 위의 치명적인 오류를 생성.
일단 당신이 문제를 알고, 해결책은 간단합니다 – 엄격한 비교를 사용하여.
메아리 ( $=== $ C ); // 거짓 (및 오류)
엄격한 비교는 단순히 여부를 두 개체가 메모리에서 같은 위치에 있으며, 그래서 심지어 속성의 값을 쳐다보지 않는 검사.
주의. 같은 문제는 negated 비교 연산자를 사용하여 발생할 수 (사용 !== 대신 !=) 그리고 in_array를 사용하여 (엄격한 비교를 나타내는 in_array의 세 번째 매개 변수를 사용).
