symfony2에서 일부 클래스의 인스턴스가 아닌지 확인하는 방법


83

엔티티가 일부 클래스가 아닌 일부 클래스의 구성원 인 경우 일부 기능을 실행하고 싶습니다.

라는 함수가 instanceof있습니다.

하지만 뭔가

if ($entity !instanceof [User,Order,Product])

1
instanceof는 함수가 아니라 키워드입니다. 그리고 아닙니다. PHP 언어에는 이와 같은 것이 없습니다. 직접 함수를 구현해야합니다.
GordonM

Đéo 탕 NAO 공동 GIAI pháp 라 혼 계
부 트란 키엔

답변:


146

공통 인터페이스를 제공 한 다음

if (!$entity instanceof ShopEntity)

또는 함께

if (!$entity instanceof User && !$entity instanceof Product && !$entity instanceof Order)

한곳에 일부 문자를 저장하기 위해 임의의 함수를 만드는 것을 피할 것입니다. 반면에 "너무 자주"필요한 경우 디자인 결함이있을 수 있습니까? ( "너무 많은 엣지 케이스"등의 의미에서)


63
더 낫지 if (!($entity instanceof User))않을까요?
Daniel W.

7
@DanFromGermany 차이를 만들지 않습니다. 가독성 일 수도 있습니다. 그것은 당신에게 달려 있습니다.
KingCrunch 2014

1
@KingCrunch 왜 그것이 차이를 만들지 않는지 개념적으로 매우 혼란 스럽습니까? 나는 Dragos의 대답과 합리화를 선호합니다. 실제로 확인하기 전에 확인하려는 인스턴스를 부정하는 것이 더러워 보이기 때문에 제가하는 방식입니다.
Jonathan

6
@Jonathan 참조 php.net/manual/en/language.operators.precedence.php 마지막에는 $a+$b+$c($a+$b)+$c. 시도한 적이 2**3**4 == (2**3)**4있습니까? ;)
KingCrunch

instanceof로 확인중인 클래스를 가져 오거나 사용하십시오. 예 : 위해 if ( $entity instanceof Audio )나는이 필요합니다 use App\Entity\Audio;. 검사중인 클래스를 사용하지 않으면 PHP에서 오류가 발생하지 않지만 if는 실행되지 않습니다.
일곱

70

PHP 매뉴얼에 따르면 : http://php.net/manual/en/language.operators.type.php

!($a instanceof stdClass)

이것은 논리적이고 "문법적으로"올바른 구문입니다.

!$class instanceof someClass

그러나 위의 제안 된 구문은 부정의 범위를 정확히 지정하지 않았기 때문에 까다 롭습니다 : 변수 자체 또는 $class instanceof someclass. 여기서는 연산자 우선 순위에만 의존하면됩니다 [@Kolyunya 덕분에 편집 됨].


6
이것은 더 깨끗한 솔루션입니다. 나는 사람들이이 질문에 결국 확인 절반 때문에보기 시작 해요 if (!$entity instanceof ShopEntity)직관적 아니지만 ... 저희의 많은 사용 !$entity으로 $entity === null.
mimoralea

6
무슨 뜻 We will only have to rely here on the smart implementation of the PHP parser.입니까? instanceof연산자가 연산자보다 우선 순위가 높다는 것을 명확하게 나타내는 언어 사양이 !있습니다.
Kolyunya

2
@Kolyunya 가독성, 대 "흠, 외모 이상한 것을 것은 ... 나, PHP의 연산자 우선 순위 ... 확인을 살펴 보자 그 체크 아웃"
브래드 켄트

13

PHP 연산자 우선 순위

instanceof 연산자는 부정 직전에 다음 식입니다.

!$class instanceof someClass

PHP에서 옳고 이것은 당신이 기대하는 것입니다.


앞서 언급했듯이 키 노트는 instanceof연산자 의 우선 순위 가보다 높으므로 !명령문이 진정한 결과를 제공한다는 것입니다. 감사합니다
ako ako

2

이 함수는 다음을 수행해야합니다.

function isInstanceOf($object, Array $classnames) {
    foreach($classnames as $classname) {
        if($object instanceof $classname){
            return true;
        }
    }
    return false;
}

그래서 당신의 코드는

if (!isInstanceOf($entity, array('User','Order','Product')));

0
function check($object) {
    $deciedClasses = [
        'UserNameSpace\User',
        'OrderNameSpace\Order',
        'ProductNameSpace\Product',
    ];

    return (!in_array(get_class($object), $allowedClasses));
}

이것은 상속을 잘 처리하지 못합니다.
hkoosha

0

또는 이것을 시도 할 수 있습니다

    $cls = [GlobalNameSpace::class,\GlobalNameSpaceWithSlash::class,\Non\Global\Namespace::class];
    if(!in_array(get_class($instance), $cls)){
        //do anything
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.