is_a와 instance of의 차이점은 무엇입니까?
나는 그것이 연산자이고 그것이 방법이라는 것을 알고 있다.
이 방법은 성능이 느립니까?어떤 것을 사용하시겠습니까?
갱신하다
PHP 5.3.9의 현재,is_a()
변했다.아래 답변은 다음과 같습니다.is_a()
수용해야 합니다.Object
버전 > = 5의 세 인수인 "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
.
원래의
로로 actually actually actually actually.is_a
는 함수입니다만,instanceof
는 언어 구성입니다. is_a
는 (함수 호출 실행에 대한 오버헤드가 모두 있기 때문에) 상당히 느리지만 전체 실행 시간은 어느 쪽이든 최소입니다.
5.3부터는 더 이상 권장되지 않으므로 걱정할 필요가 없습니다.
하지만 한 가지 차이점이 있다. is_a
함수가 되는 것은 객체를 파라미터 1로, 문자열(예: 문자열, 상수 또는 리터럴)을 파라미터 2로 가져옵니다. ★★★★★★★★★★★★★★★★:
is_a($object, $string); // <- Only way to call it
instanceof
또는 ID(따옴표 쓴 를로서 할 수 .
$object instanceof $string; // <- string class name
$object instanceof $otherObject; // <- object instance
$object instanceof ClassName; // <- identifier for the class
is_a() 및 사례 of의 퍼포먼스 결과를 다음에 나타냅니다.
Test name Repeats Result Performance
instanceof 10000 0.028343 sec +0.00%
is_a() 10000 0.043927 sec -54.98%
테스트 소스가 여기 있습니다.
instanceof
는 다른 오브젝트인스턴스, 클래스 이름 또는 인터페이스와 함께 사용할 수 있습니다.
그건 아닌 것 같아 is_a()
는 인터페이스(클래스명을 나타내는 문자열만)와 연동하지만, 동작하고 있는 경우는 정정해 주세요.
(갱신: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 in in in in inis_a()
는 PHP 5.3.0 이후 폐지되었습니다.이런 건 공식 출처를 이용하는 게 항상 안전하다고 생각해요
Daniel씨, 당신의 질문에 대해서, 성능의 차이는 말할 수 없지만, 그 중 일부는 읽기 쉽고 작업하기 쉬운 것으로 귀결될 것입니다.
또한, 부정하는 것에 대한 혼란에 대한 몇 가지 논의가 있습니다.instanceof
vs '체크'is_a()
를 들어, 예예,의 instanceof
하다
<?php
if( !($a instanceof A) ) { //... }
?>
음음 vs vs vs 의 경우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가 버그를 억제하는 동안 발생할 수 있는 버그를 강조 표시합니다.
이 시나리오가 있습니다.is_a()
instanceof
패합니니다다
instanceof
는 리터럴클래스 이름 또는 오브젝트 또는 문자열(클래스 이름 포함)인 변수를 오른쪽 인수로 예상합니다.
그러나 함수 호출에서 클래스 이름의 문자열을 제공하려고 하면 작동하지 않고 구문 오류가 발생합니다.
같은 , 그렇다, 아니다, 아니다, 아니다.is_a()
.
예:
<?php
function getClassName() : string
{
return "Foobar";
}
class Foobar
{
private $xyz;
}
$x = new Foobar();
// this works of course
var_dump($x instanceof Foobar);
// this creates a syntax error
var_dump($x instanceof getClassName());
// this works
var_dump(is_a($x, getClassName()));
이것은 PHP 7.2.14에 근거하고 있습니다.
최적화는 최소한입니다.마이크로 최적화는 코드의 가독성, 이해성 및 안정성 앞에서 결코 좋은 답이 아닙니다.
(개인적으로는 마음에 드는데 선택지는 고객님 몫입니다;)
주요 차이점은 인스턴스와 함께 직접 클래스 이름을 사용할 수 있다는 것입니다.
MyClass 인스턴스 1개
보다 짧다
is_a($a, MyClass:: 클래스)
(알겠습니다) 사소한 일이 아닙니다.)
instance of (언어 구조)와 is_a 사이의 구문적인 색상도 (저에게는) 매우 유용합니다.기능 색상을 더 큰 작업에 사용할 수 있습니다.또한 if의 경우 instance of dosn에는 더 이상의 괄호가 필요하지 않습니다.
주의: 물론 MyClass::class 대신 짧은 직접 문자열을 사용할 수 있습니다.
is_a($a, 'MyClass')
하지만 코드에 직접 문자열을 사용하는 것은 좋은 방법이 아닙니다.
단순 문자열과 클래스 이름을 구분할 수 있는 경우 구문 조합이 더 좋고 유용합니다.그리고 클래스 이름을 계속 붙이면 이름을 쉽게 바꿀 수 있습니다.네임스페이스를 별칭과 함께 사용하는 경우 특수합니다.
그럼 wy 사용법은?
같은 존재의 경우: 가독성과 불안정성.(선택지는 사용자의 것입니다) ! 또는 다른 부울 연산자와 함께 사용할 경우 is_a는 괄호 안에 더 정확해 보입니다.
if (!is_a ($a, MyClass::class) 또는 is_a ($a, MyOtherClass::class))
가독성:
if ( $a AND ( ! ( My Class의 $a instance ) or ( My Other Class의 $a intence ) )
다른 좋은 이유는 함수에서 콜백을 사용해야 하는 경우입니다.( array _ map ... )인스턴스는 함수가 아니라 언어구성이기 때문에 콜백으로 사용할 수 없습니다.
이러한 경우 is_a는 유용하게 사용될 수 있습니다.
퍼포먼스에 대해서는 말할 수 없습니다.아직 아무것도 측정하지 않았습니다만, 무엇을 시도하고 있는지에 따라서는,instanceof
최근에 이 문제에 대해 질문한 내용을 확인해 보십시오.
클래스 상수로 인해 PHP 'instance of' 실패
쓰게 .is_a
대신.나는 의 구조가 마음에 든다.instanceof
(더 좋게 읽힐 것 같아서) 계속 쓸 수 있는 데로 쓸 거예요.
여기서 얻을 수 있는 퍼포먼스 결과는 다음과 같습니다.
instanceof
더 빠릅니다.
기능들
function method_1($a = null) {
return is_object($a) && is_a($a, 'Example');
}
function method_2($a = null) {
return is_a((object) $a, 'Example');
}
function method_3($a = null) {
return $a instanceof 'Example';
}
횟수(각 5000회 실행)
0.00573397 // method_1(5)
0.01437402 // method_2(5)
0.00376201 // method_3(5)
is_a()에 대해 주목해야 할 한 가지 흥미로운 점은 오토로더, 네임스페이스 및 에일리어스를 클래스에 사용하는 경우 is_a()에서 클래스의 진정한 풀네임을 사용해야 한다는 것입니다.이 메서드는 컨텍스트의 내용을 잘 이해하지 못하기 때문입니다.반면, 이해한다는 거죠.
예: (말장난 의도 없음):
<?php
namespace MyNamespace;
use \MyNamespace\User;
use \MyNamespace\Thing as Something;
class Test
{
public function doTest()
{
$user = new User();
var_dump(is_a($user, "User")); // false
var_dump(is_a($user, "\MyNamespace\User")); // true
var_dump($user instanceof User); // true
var_dump($user instanceof \MyNamespace\User); // true
}
public function doAnotherTest()
{
$something = new Something();
var_dump(is_a($something, "Something")); // false
var_dump(is_a($something, "\MyNamespace\Thing")); // true
var_dump($something instanceof Thing); // true
var_dump($something instanceof \MyNamespace\Thing); // true
}
}
언급URL : https://stackoverflow.com/questions/3017684/what-is-the-difference-between-is-a-and-instanceof
'itsource' 카테고리의 다른 글
PHP XML Nice 형식을 출력하는 방법 (0) | 2022.09.24 |
---|---|
Sublime Text 2에서 Python 코드를 실행하려면 어떻게 해야 하나요? (0) | 2022.09.24 |
파일이 있는지 확인하는 방법? (0) | 2022.09.24 |
MySQL을 OSX 10.7 Lion으로 사용하기 (0) | 2022.09.24 |
어레이 목록의 길이를 찾는 방법 (0) | 2022.09.24 |