Soru PHP: dizgi tarafından temsil edilen bir sınıf adı için instanceof eşdeğeri


Bir örnekle açıklamak en iyisidir. Kod çalışacak bir işlev "theFunctionILookFor" aramak.

$myClassName = "someName";
$parentOrInterfaceName = "someParent";
if ( theFunctionILookFor ($myClassName))  echo "is parrent";

düzenleme: Sadece bu denetimi gerçekleştirmek için sınıfı başlatmayı denemeye çalışıyorum. Kontrol fonksiyonuna 2 string parametresini geçebilmek istiyorum


25
2018-01-06 18:48


Menşei




Cevaplar:


Bu benim cevabım gibi görünüyor: is_subclass_of

Her iki parametreyi de dizge olarak kabul edebilir

http://php.net/manual/en/function.is-subclass-of.php


37
2018-01-06 18:59



Bunu not et is_subclass_of Yalnızca çocuklar için kontrol edin ve sınıfın ikinci parametre ile aynı olması durumunda eşleşmeyecektir: class MyClass {} var_dump(is_subclass_of('MyClass', 'MyClass')); var_dump(is_subclass_of(new MyClass(), 'MyClass'));  Sonuç: boolean false boolean false - CDuv
Ayrıca kullanabilirsiniz is_a() ve geçmek TRUE dizelere izin veren üçüncü parametre olarak. - Boom
Cevap @Unsigned tarafından cevaplandı. - Alaeddine
Bu dikkat çekmeye değer is_subclass_of classname mevcut değilse autoloader'ı tetikler. Üçüncü parametre eğer değil falseancak daha sonra ilk parametre olarak bir dize sağlayamazsınız. - TechNyquist


bence instanceof okumak için çok daha hızlı ve daha net.

instanceof dizeler üzerinde çalışmaz, çünkü bir sınıf için "tanımlayıcı" olarak kullanılabilir:

 $temp = 'tester';
 $object  = new sub();
 var_dump($object instanceof $temp); //prints "true" on php 5.3.8

 class tester{}

 class sub extends \tester{

 }

Ayrıca, arayüzler üzerinde çalışır - sadece mutlak sınıf adını içerecek bir değişkene ihtiyacınız var (ad alanı dahil,% 100 emin olmak istiyorsanız).


7
2018-01-18 18:29



Değişkenlerle çalışır ancak dize değişmezleriyle (... instanceof "tester"). Şimdi deniyorum. - James P.
OP, a) nesnenin bulunmadığı durum hakkında açıkça sorulmuştur, b) nesnenin somutlaştırılmaması gerekir. Bu, şu anda geçerli olduğu gibi soruya cevap vermiyor. - vaxquis


Deneyin is_subclass_of(). Her iki parametreyi de dizge olarak kabul edebilir. http://php.net/manual/en/function.is-subclass-of.php


4
2018-02-23 15:23





Kullanmak Yansıma API'sı, yapabilirsin Bir ReflectionClass nesnesi oluşturmak sınıfın adını ve bir nesneyi kullanarak.


3
2018-01-06 18:53





Bunu kullanabilir misin?

http://www.php.net/manual/en/function.get-parent-class.php

Sayfadan:

get_parent_class

(PHP 4, PHP 5, PHP 7)
  get_parent_class - Üst sınıfı alır   nesne veya sınıf adı

Açıklama

string get_parent_class ([ mixed $object ] )

Ebeveyni geri alır   nesne veya sınıf için sınıf adı.


3
2018-01-06 18:53



Arayüzlerden ne haber? - ircmaxell
php.net/manual/en/function.is-subclass-of.php#89615 - llange


Bu eski bir iş parçacığı, ama yine de gelecekteki referans için, işlevleri kullanabilirsiniz is_a ve is_subclass_of Bunu daha verimli bir şekilde gerçekleştirmek için. Hiçbir şeyi başlatmaya gerek yok, sadece dizginizi şu şekilde geçirebilirsiniz:

if (is_subclass_of($myObject, 'SomeClass')) // is_a(...)
  echo "yes, \$myObject is a subclass of SomeClass\n";
else
  echo "no, \$myObject is not a subclass of SomeClass\n";

PHP Dokümanlar:

http://www.php.net/manual/en/function.is-a.php
http://www.php.net/manual/en/function.is-subclass-of.php

1
2018-03-11 16:53



Unutmayın ki is_a() ve is_subclass_of() eşdeğer değildir. Bir sınıf kendi kendine bir alt sınıf değildir. - Boom


instanceof() genellikle kötü uygulama olarak kabul edilir. Görmek bu forum konusu Bir açıklama için (Java için yazılmış, ancak ona özgü değil).

Yani, bu fonksiyonun PHP karşılığı instanceof operatör olarak,

$a = new MyClass;

if($a instanceof MyClass) {
  CODE
}

Görmek Dökümantasyon.


-1
2018-01-06 18:53



NE? Suistimal edilebilir, ancak arayüz kullanımı için daha iyi bir araç var mı? Bu konuda aptal olmadığın sürece, oldukça güçlü. Ve cevabınızın yeni bir bilgi eklemediğinden bahsetmeyin, çünkü sınıflardan ve örneklerden bahsetmiyor ('foo' instanceof 'bar'hata olacak.) ... - ircmaxell
Üzgünüz, onun düzenlenmemiş sorusu net değildi. Ayrıca, bununla da ilgilenebilirsiniz: canonical.org/~kragen/isinstance - syrion