web-gelistirme-sc.com

Symfony2 bir sınıf örneği olmadığını kontrol

Varlık birkaç sınıfın üyesiyse bazılarını değil de bazı işlevleri yürütmek istiyorum.

instanceof adında bir işlev var.

Ama böyle bir şey var mı

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

Onlara ortak bir arayüz ver ve sonra

if (!$entity instanceof ShopEntity)

ya da yanında kal 

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

Bazı karakterleri tek bir yerde kaydetmek için rastgele işlevler oluşturmaktan kaçınırdım. Diğer tarafta "çok sık" ihtiyacınız varsa, bir tasarım hatası olabilir mi? ("Çok fazla Edge davası" veya benzeri anlamında)

111
KingCrunch

PHP kılavuzu diyor ki: http://php.net/manual/en/language.operators.type.php

!($a instanceof stdClass)

Bu sadece mantıklı ve "gramer" doğru bir yazılı sözdizimidir.

!$class instanceof someClass

Yukarıda önerilen sözdizimi zor, çünkü olumsuzun tam olarak kapsamının hangisi olduğunu belirtmiyoruz: değişkenin kendisi veya $class instanceof someclass yapısının tamamı. Burada sadece operatör önceliğine güvenmek zorunda kalacağız [Düzenlendi, @Kolyunya sayesinde].

50
Dragos

PHP Operatör Önceliği

instanceof operatörü, olumsuzlamadan hemen önce, sonra şu ifadedir:

!$class instanceof someClass

PHP de haklı ve beklediğiniz gibi.

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

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

Bu işlev yapmalı:

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

Demek kodun 

if (!isInstanceOf($entity, array('User','Order','Product')));
1
Bruno Schäpper

Veya bunları deneyebilirsin

    $cls = [GlobalNameSpace::class,\GlobalNameSpaceWithSlash::class,\Non\Global\Namespace::class];
    if(!in_array(get_class($instance), $cls)){
        //do anything
    }
0
Zuko