Okej, miałem dwa duże projekty, w których kontrolowałem serwer na tyle, aby przestrzeń nazw i polegać na automatycznym ładowaniu.
Najpierw Automatyczne ładowanie jest niesamowite. Nie martwienie się o wymagania jest względnie dobrą rzeczą.
Oto program ładujący, z którego korzystałem przy kilku projektach. Sprawdza, czy klasa najpierw znajduje się w bieżącej przestrzeni nazw, a następnie wysyła kaucję, jeśli nie. Stamtąd jest tylko trochę manipulacji ciągiem, aby znaleźć klasę.
<?php
spl_autoload_register(__NAMESPACE__ . '\\autoload');
function autoload($cls)
{
$cls = ltrim($cls, '\\');
if(strpos($cls, __NAMESPACE__) !== 0)
return;
$cls = str_replace(__NAMESPACE__, '', $cls);
$path = PLUGIN_PATH_PATH . 'inc' .
str_replace('\\', DIRECTORY_SEPARATOR, $cls) . '.php';
require_once($path);
}
Można to łatwo dostosować do użytku bez przestrzeni nazw. Zakładając, że jednolicie prefiksujesz klasy wtyczki / motywu, możesz po prostu przetestować ten prefiks. Następnie użyj podkreślników w nazwie klasy jako symboli zastępczych dla separatorów katalogów. Jeśli korzystasz z wielu klas, prawdopodobnie będziesz chciał użyć jakiegoś autoloadera z mapami klas.
Przestrzenie nazw i haki
System przechwytujący WordPress działa przy użyciu call_user_func
(i call_user_func_array
), który bierze nazwy funkcji jako ciągi znaków i wywołuje je w momencie wywołania funkcji do_action
(a następnie call_user_func
).
Dzięki przestrzeniom nazw oznacza to, że musisz przekazać w pełni kwalifikowane nazwy funkcji, które obejmują przestrzeń nazw w zaczepach.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', 'WPSE\\SomeNameSpace\\the_function');
function the_function()
{
return 'did stuff';
}
Prawdopodobnie lepiej byłoby swobodnie korzystać ze __NAMESPACE__
stałej magii, jeśli chcesz to zrobić.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', __NAMESPACE__ . '\\the_function');
function the_function()
{
return 'did stuff';
}
Jeśli zawsze umieszczasz swoje haczyki na zajęciach, jest to łatwiejsze. Standard tworzy instancję klasy i wszystkie zaczepienia w konstruktorze, które $this
działają poprawnie.
<?php
namespace WPSE\SomeNameSpace;
new Plugin;
class Plugin
{
function __construct()
{
add_action('plugins_loaded', array($this, 'loaded'));
}
function loaded()
{
// this works!
}
}
Jeśli używasz metod statycznych takich jak ja, musisz przekazać w pełni kwalifikowaną nazwę klasy jako pierwszy argument tablicy. To dużo pracy, więc możesz po prostu użyć magicznej __CLASS__
stałej lub get_class
.
<?php
namespace WPSE\SomeNameSpace;
Plugin::init();
class Plugin
{
public static function init()
{
add_action('plugins_loaded', array(__CLASS__, 'loaded'));
// OR: add_action('plugins_loaded', array(get_class(), 'loaded'));
}
public static function loaded()
{
// this works!
}
}
Korzystanie z podstawowych klas
Rozwiązywanie nazw klas PHP jest nieco nieporadne. Jeśli zamierzasz używać podstawowych klas WP ( WP_Widget
w poniższym przykładzie), musisz podać use
instrukcje.
use \WP_Widget;
class MyWidget extends WP_Widget
{
// ...
}
Możesz też użyć w pełni kwalifikowanej nazwy klasy - po prostu poprzedzając ją odwrotnym ukośnikiem.
<?php
namespace WPSE\SomeNameSpace;
class MyWidget extends \WP_Widget
{
// ...
}
Definiuje
To jest bardziej ogólny PHP, ale mnie ugryzł, więc oto jest.
Możesz zdefiniować rzeczy, których będziesz często używać, np. Ścieżkę do wtyczki. Użycie instrukcji defin powoduje umieszczenie rzeczy w głównej przestrzeni nazw, chyba że jawnie przepiszesz przestrzeń nazw w pierwszym argumencie definicji.
<?php
namespace WPSE\SomeNameSpace;
// root namespace
define('WPSE_63668_PATH', plugin_dir_path(__FILE__));
// in the current namespace
define(__NAMESPACE__ . '\\PATH', plugin_dir_path(__FILE__));
Możesz także użyć tego const
słowa kluczowego na poziomie głównym pliku z PHP 5.3 plus. consts
s są zawsze w bieżącej przestrzeni nazw, ale są mniej elastyczne niż define
połączenie.
<?php
namespace WPSE\SomeNameSpace;
// in the current namespace
const MY_CONST = 1;
// this won't work!
const MY_PATH = plugin_dir_path(__FILE__);
Dodaj dowolne inne wskazówki, które możesz mieć!
Korzystam z automatycznego ładowania (ponieważ moja wtyczka ma mnóstwo klas - częściowo dlatego, że zawiera Twig), nigdy nie zwróciłem uwagi na problem (wtyczka zainstalowana> 20 000 razy).
Jeśli masz pewność, że nigdy nie będziesz musiał korzystać z instalacji php, która nie obsługuje przestrzeni nazw, to wszystko jest w porządku (~ 70% obecnych blogów wordpress nie obsługuje przestrzeni nazw). Kilka rzeczy do zapamiętania:
Wydaje mi się, że pamiętam, że w nazwach nie rozróżniana jest wielkość liter w zwykłym php, ale w przypadku korzystania z Fastcgi php na iis - powoduje to pewne bóle głowy, jeśli testujesz na systemie Linux i nie wykrywasz nieuczciwych małych liter.
Nawet jeśli masz pewność, że kod, który obecnie opracowujesz, będzie używany tylko w wersji> 5.3.0, nie będziesz mógł ponownie użyć żadnego kodu w projektach, które nie mają tego luksusu - to główny powód, dla którego nie używane przestrzenie nazw w projektach wewnętrznych. Przekonałem się, że przestrzenie nazw naprawdę nie dodają tak wiele w porównaniu z możliwym bólem głowy związanym z koniecznością usunięcia zależności od nich.
źródło