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' );