itsource

is_a와 instance of의 차이점은 무엇입니까?

mycopycode 2022. 9. 24. 12:34
반응형

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

반응형