나는 그것이 연산자이고 그것이 방법이라는 것을 알고 있다.
이 방법은 성능이 느립니까?어떤 것을 사용하시겠습니까?
질문에 대한 답변
갱신하다
PHP 5.3.9의 현재,is_a()
변했다.아래 답변은 다음과 같습니다.is_a()
수용해야 합니다.Object
첫 번째 인수로 PHP 버전 > = 5.3.9는 이제 옵션의 세 번째 부울 인수를 받아들입니다.$allow_string
(에 준함)false
) 대신 문자열 클래스 이름을 비교할 수 있습니다.
class MyBaseClass {} class MyExtendingClass extends MyBaseClass {}
// Original behavior, evaluates to false. is_a(MyExtendingClass::class, MyBaseClass::class);
// New behavior, evaluates to true. is_a(MyExtendingClass::class, MyBaseClass::class, true);
새로운 동작의 주요 차이점은instanceof
그리고.is_a()
그것이다instanceof
는 항상 타겟이 지정된 클래스의 인스턴스화된 오브젝트(확장 클래스 포함)인지 확인합니다만,is_a()
오브젝트의 인스턴스화가 필요한 것은, 다음의 경우에 한정됩니다.$allow_string
인수는 디폴트값으로 설정되어 있습니다.false
.
원래의
정말로.is_a
는 함수입니다만,instanceof
는 언어 구성입니다.
is_a
는 (함수 호출 실행에 대한 오버헤드가 모두 있기 때문에) 상당히 느리지만 전체 실행 시간은 어느 쪽이든 최소입니다.
5.3부터는 더 이상 권장되지 않으므로 걱정할 필요가 없습니다.
하지만 한 가지 차이점이 있다.
is_a
함수가 되는 것은 객체를 파라미터 1로, 문자열(예: 문자열, 상수 또는 리터럴)을 파라미터 2로 가져옵니다.그래서:
is_a($object, $string); // <- Only way to call it
instanceof
는 오브젝트를 파라미터1로 하여 클래스명(클래스명), 오브젝트인스턴스(클래스인스턴스) 또는 클래스 ID(따옴표 없이 쓴 클래스명)를 파라미터2로 할 수 있습니다.
$object instanceof $string;
// <- string class name $object instanceof $otherObject; // <- object instance $object instanceof ClassName;
// <- identifier for the class
is_a() 및 instance of의 퍼포먼스 결과를 다음에 나타냅니다.
Test name
Repeats
Result
Performance
instanceof
10000
0.028343 sec
+0.00% is_a()
10000
0.043927 sec
-54.98%
테스트 소스가 여기 있습니다.
instanceof
는 다른 오브젝트인스턴스, 클래스 이름 또는 인터페이스와 함께 사용할 수 있습니다.인터페이스(클래스명을 나타내는 문자열만)에서는 동작하지 않는 것 같습니다만, 동작하는 경우는 정정해 주세요.(갱신:https://gist.github.com/1455148) 를 참조해 주세요.
php.net의 예:
interface MyInterface { }
class MyClass implements MyInterface { }
$a = new MyClass; $b = new MyClass; $c = 'MyClass'; $d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass var_dump($a instanceof $c); // $c is a string 'MyClass' var_dump($a instanceof $d); // $d is a string 'NotMyClass'
출력:
bool(true) bool(true) bool(false)
ChrisF의 답변에 대해is_a()
는 PHP 5.3.0 이후 폐지되었습니다.이런 건 공식 출처를 이용하는 게 항상 안전하다고 생각해요
Daniel씨, 당신의 질문에 대해서, 성능의 차이는 말할 수 없지만, 그 중 일부는 읽기 쉽고 작업하기 쉬운 것으로 귀결될 것입니다.
또한, 부정하는 것에 대한 혼란에 대한 몇 가지 논의가 있습니다.instanceof
체크와is_a()
예를 들어,instanceof
다음과 같은 작업을 수행합니다.
<?php if( !($a instanceof A) ) { //... } ?>
다음과 같은 경우is_a()
:
<?php if( !is_a($a, 'A' ) { //... } ?>
또는
<?php if( is_a($a, 'A') === FALSE) { //... } ?>
편집 ChrisF가 답변을 삭제한 것처럼 보이지만 내 답변의 첫 부분은 여전히 유효합니다.
속도 외에도 엣지 케이스를 어떻게 다루느냐가 중요한 차이점이다.
is_a($x1, $x2) // fatal error if x2 is not a string nor an object $x1 instanceof $x2
// returns false even if $x2 is int, undefined, etc.
따라서 is_a()는 instance가 버그를 억제하는 동안 발생할 수 있는 버그를 강조 표시합니다.