Nie, nie można „zainicjować” ani utworzyć instancji klasy za pomocą haka, a nie bezpośrednio. Zawsze wymagany jest jakiś dodatkowy kod (i nie jest to pożądane, aby móc to zrobić, ponieważ otwierasz puszkę robaków dla siebie).
Oto lepszy sposób na zrobienie tego:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Oczywiście można jeszcze stworzyć klasę interfejsu, aby uprościć ją w ogólnym przypadku:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Zauważ, że jako interfejs nie możesz bezpośrednio utworzyć obiektu tego typu, ale możesz utworzyć podklasę, pozwalając powiedzieć:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Który następnie automatycznie doda wszystkie haki, wystarczy zdefiniować, co dokładnie jest robione w podklasie, a następnie utworzyć!
Na konstruktorach
Nie dodałbym konstruktora jako funkcji przechwytującej, to zła praktyka i może prowadzić do wielu niezwykłych zdarzeń. Także w większości języków konstruktor zwraca obiekt, który jest tworzony, więc jeśli haczyk musi zwrócić coś takiego jak w filtrze, nie zwróci filtrowanej zmiennej, ale zamiast tego zwróci obiekt klasy.
Wywoływanie konstruktora lub destruktora jest bardzo, bardzo, bardzo złą praktyką programistyczną, bez względu na to, w jakim języku się posługujesz, i nigdy nie powinno się go wykonywać.
Konstruktorzy powinni również konstruować obiekty, aby inicjalizować je w gotowości do użycia, a nie do rzeczywistej pracy. Praca do wykonania przez obiekt powinna odbywać się w osobnej funkcji.
Metody klasy statycznej i wcale nie wymagające tworzenia instancji / inicjalizacji
Jeśli twoja metoda klasy jest statyczną metodą klasy, możesz przekazać nazwę klasy w cudzysłowie, a nie $this
jak pokazano poniżej:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Zamknięcia i PHP 5.3
Niestety nie można uniknąć linii tworzącej nową klasę. Jedynym innym rozwiązaniem pomijania byłoby kod płyty kotłowej, który wciąż ma tę linię, i wymagałby PHP 5.3+ np .:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
W którym momencie równie dobrze możesz pominąć klasę i po prostu użyć funkcji:
add_action('admin_init',function(){
// do stuff
});
Pamiętaj jednak, że wprowadziłeś teraz spektrum anonimowych funkcji. Nie ma sposobu na usunięcie powyższej akcji za pomocą remove_action
, a to może i powoduje wielki ból dla programistów, którzy muszą pracować z kodem innych ludzi.
Na Ampersands
Możesz zobaczyć takie działania:
array( &$this, 'getStuffDone' );
To jest złe . &
został dodany z powrotem w PHP 4, gdy obiekty były przekazywane jako wartości, a nie jako referencje. PHP 4 ma ponad dekadę i od dawna nie był obsługiwany przez WordPress.
Nie ma powodu, aby używać go &this
podczas dodawania haków i filtrów, a usunięcie odwołania nie spowoduje żadnych problemów, a nawet może poprawić zgodność z przyszłymi wersjami PHP
Użyj tego zamiast:
array( $this, 'getStuffDone' );
$class
jako nazwy zmiennej, te słowa są zwykle zastrzeżone. Myślę, że robisz wszystko, co w twojej mocy, aby uniknąć mówienia czegoś podobnego$x = new Y();
w zakresie globalnym i dodajesz złożoności tam, gdzie nic nie jest konieczne. Próba zmniejszenia ilości napisanego kodu wymagała napisania większej ilości kodu!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Przykładowa klasa
Uwagi:
! class_exists
aby uniknąć podwójnego wywołania i umieścić wywołującego init w środkuinit
funkcję i klasę varstatic
new self
.Oto przykład
Php 5+
Proszę , zostaw to
&
. Jesteśmy już poza php4. :)źródło
źródło
Możesz wywoływać zdarzenia w swojej klasie bez konieczności początkowego ładowania . Jest to przydatne, jeśli nie chcesz ładować pełnej klasy z góry, ale potrzebujesz dostępu do filtrów i akcji WordPress.
Oto bardzo prosty przykład
Jest to bardzo uproszczona wersja odpowiedzi Kaisera, ale w prosty sposób pokazuje zachowanie. Może być przydatny dla tych, którzy patrzą na ten styl po raz pierwszy.
Inne metody mogą nadal inicjować obiekt, jeśli jest to wymagane. Osobiście używam tej metody, aby umożliwić opcjonalnym częściom mojej wtyczki kolejkowanie skryptów, ale wyzwalanie obiektu tylko na żądanie AJAX.
źródło
To działa dla mnie:
źródło
Ogólnie rzecz biorąc, nie dodawalibyście całej klasy do haka. W
add_action()
/add_filter()
haki oczekiwać zwrotnych funkcje , które mogą się odwoływać od wewnątrz klasy .Powiedzmy, że masz
init()
funkcję w swojej klasie, którą chcesz podłączyć do haka WordPressinit
.Umieść
add_action()
połączenie w klasie, a następnie zidentyfikuj połączenie zwrotne w następujący sposób:(Uwaga: Zakładam, że twoja klasa ma odpowiednią przestrzeń nazw; w przeciwnym razie pamiętaj o przestrzeni nazw swoich funkcji zwrotnych).
źródło
init
(lub gdziekolwiek jej potrzebujesz)?Powinieneś być w stanie to zrobić, przekazując nazwę klasy zamiast obiektu instancji:
(Teoretycznie inne rozwiązanie również powinno działać
Nie jestem pewien, dlaczego tak nie jest. Może jeśli nie zadzwonisz przez referencję?)
źródło
init
metodę statyczną . Zobacz wordpress.stackexchange.com/a/48093/14052