Po co używać if function_exists?

30

Zauważyłem, że wielu programistów motywów WordPress użyłoby tego w functions.php

if (function_exists('register_nav_menus')) {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

Dla mnie zawsze używam add działań do każdej funkcji, której używam w functions.php

Tak więc powyższe zapisano by jako:

add_action('init', 'my_register_nav_menus');

function my_register_nav_menus() {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

Mam dwa pytania:

  1. Po co używać instrukcji if w pierwszej metodzie?

  2. Który jest prawidłowy?

Greeso
źródło

Odpowiedzi:

35

Sprawdzanie, czy istnieją wbudowane funkcje WordPress przed ich wywołaniem, zapewnia zgodność wsteczną, której IMHO nie jest potrzebne.

Więc jeśli widzisz, if ( function_exists( 'register_nav_menus' ) )że autor motywu obsługuje wersje wcześniejsze niż 3.0.

Nadal czasami widzisz if ( function_exists( 'dynamic_sidebar' ) )Dlaczego? Nie mogłem ci powiedzieć, ponieważ dynamic_sidebar został wprowadzony w 2.2.

Innym powodem, dla którego warto go użyć, jest podłączenie motywu lub wtyczki. Funkcja podłączalna to taka, którą można zastąpić w motywie potomnym lub innej wtyczce.

Odbywa się to w definicji, a nie w wywołaniu i używasz! operator, aby upewnić się, że jeszcze nie istnieje, zanim go zdefiniujesz.

if ( ! function_exists( 'my_awesome_function' ) ) {
/**
 * My Awesome function is awesome
 *
 * @param array $args
 * @return array
 */
function my_awesome_function( $args ) {
  //function stuff
  return array();
  }
}

Po wykonaniu tej czynności motyw podrzędny lub inna wtyczka może zastąpić tę funkcję własną.

Chris_O
źródło
9

Ta function_existsfunkcja nie jest innym sposobem na załadowanie funkcji, podobnie jak add_actionjej w celu sprawdzenia kodu, aby zobaczyć, że nie ma innej funkcji o tej samej nazwie, więc nie złamie kodu. Z php.net:

Sprawdza listę zdefiniowanych funkcji, zarówno wbudowanych (wewnętrznych), jak i zdefiniowanych przez użytkownika, dla funkcji nazwa_funkcji.

Jeśli masz dwa razy tę samą funkcję w kodzie, to się zepsuje , dlatego twoją funkcję poprzedzasz czymś innym niż wp_.

Czytaj więcej: http://php.net/manual/en/function.function-exists.php

Pontus Abrahamsson
źródło
0

możesz użyć http://php.net/function_exists

if(function_exists('my_function')){
   // my_function is defined
}

LUB jeśli chcesz zobaczyć wszystkie dostępne funkcje, więc drukujesz także wszystkie,

echo "<pre>"; print_r(get_defined_functions());

wydrukuj na stronie i możesz wyszukać tę funkcję, jeśli nie ma jej na liście, oznacza to, że nie można jej użyć.

może być konieczne aktywowanie rozszerzenia dla określonej biblioteki.

manish1706
źródło
0

php.net określa to jako

(PHP 4, PHP 5, PHP 7) function_exists - Zwraca wartość PRAWDA, jeśli dana funkcja została zdefiniowana

Zgadzam się z Michelle w użyciu, że [sh] możesz użyć czeku tylko do czegoś podobnego do sprawdzania rzutowania typu; więc szukałbyś, czy istnieje funkcja (na tej stronie lub z dowolnego elementu wywoływanego na tej stronie / odwołaniu do pliku), więc wiedziałbyś, czy można bezpiecznie uruchomić inną funkcję lub przeanalizować ewentualnie szablon HTML.

Jak ktoś wspomniał, jest on powszechnie używany do sprawdzania, czy Twój plik / motyw (przy użyciu WordPress) jest w stanie uruchomić potrzebne żądanie. Użyłem go do sprawdzenia, czy motyw ma określoną część szablonu.

if ( function_exists( 'register_sidebar' ) ) { get_sidebar(); }

tradesouthwest
źródło
0

function_exists należy używać po nazwie funkcji w motywie, nie wcześniej.

add_action( 'loop_start', 'add_slider' );

function add_slider() {

if ( function_exists( 'soliloquy' ) ) { 

soliloquy( 'slider', 'slug' ); 

    }

}

Sprawdza to, czy wtyczka jest aktywna przed wysłaniem funkcji i / lub znaczników, w przeciwnym razie możesz otrzymać błąd, taki jak wywołanie niezdefiniowanej funkcji.

Michelle
źródło