Ne zaman bir eklenti yaratsa new MyClass();
, onu benzersiz bir isimli değişkene ataması gerekir. Bu şekilde, sınıfın örneğine erişilebilir.
Öyleyse $myclass = new MyClass();
, o zaman bunu yapabilirdiniz:
global $myclass;
remove_action( 'wp_footer', array( $myclass, 'my_action' ) );
Bu çalışır çünkü eklentiler global isim alanına dahil edilmiştir, bu yüzden bir eklentinin ana gövdesindeki örtük değişken bildirimleri global değişkenlerdir.
Eklenti yeni sınıfın tanımlayıcısını bir yere kaydetmezse, teknik olarak bu bir hatadır. Nesneye Yönelik Programlamanın genel ilkelerinden biri, bir yerde bir değişken tarafından referans alınmayan nesnelerin, temizleme veya eleme işlemine tabi olmasıdır.
Şimdi, özellikle PHP bunu Java'nın yaptığı gibi yapmaz, çünkü PHP sorse yarısı silahlı bir OOP uygulamasıdır. Örnek değişkenler, içinde benzersiz nesne adlarına sahip dizelerdir, bir şeydir. Yalnızca değişken işlev adı etkileşiminin işleçle çalışması nedeniyle çalışırlar ->
. Yani sadece yapmak new class()
gerçekten mükemmel, sadece aptalca çalışabilir. :)
Yani, sonuçta, asla yapma new class();
. $var = new class();
$ 'I yapın ve diğer bitlerin referans göstermesi için bir şekilde erişilebilir duruma getirin.
Düzenleme: yıllar sonra
Birçok eklenti yaparken gördüğüm bir şey "Singleton" düzenine benzer bir şey kullanmak. Sınıfın tek örneğini elde etmek için bir getInstance () yöntemi oluştururlar. Bu muhtemelen gördüğüm en iyi çözüm. Örnek eklenti:
class ExamplePlugin
{
protected static $instance = NULL;
public static function getInstance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
}
GetInstance () ilk çağrıldığında sınıfı başlatır ve işaretçisini kaydeder. Bunu eylemlerde bulunmak için kullanabilirsiniz.
Bununla ilgili bir sorun, eğer böyle bir şey kullanırsanız, yapıcı içinde getInstance () yöntemini kullanamazsınız. Bunun nedeni yeni, $ örneğini ayarlamadan önce yapıcıyı çağırmasıdır, bu nedenle yapıcıdan getInstance () öğesini çağırmak sonsuz bir döngüye neden olur ve her şeyi keser.
Çözümlerden biri, yapıcıyı kullanmamak (veya en azından içinde getInstance () öğesini kullanmamak), ancak eylemlerinizi ve benzeri işlemlerinizi ayarlamak için açıkça sınıfta "init" işlevine sahip olmaktır. Bunun gibi, böyle:
public static function init() {
add_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
}
Bunun gibi bir şeyle, dosyanın sonunda, sınıf tanımlandıktan ve böyle devam ettikten sonra, eklentiyi başlatmak bu kadar basit olur:
ExamplePlugin::init();
Init eylemlerinizi eklemeye başlar ve bunu yaparken de sınıfı başlatan ve yalnızca birinin var olduğundan emin olan getInstance () işlevini çağırır. Bir init işleviniz yoksa, sınıfı başlangıçta başlatmak için bunu yaparsınız:
ExamplePlugin::getInstance();
Asıl soruya değinmek için, bu eylem kancasını dışarıdan (aka, başka bir eklentide) çıkarmak şu şekilde yapılabilir:
remove_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
Bunu plugins_loaded
eylem kancasına bağlı bir şeye koyun ve orijinal eklenti tarafından gerçekleştirilen eylemi geri alın.