Tamam, sunucunun ad alanını kontrol etmeye ve otomatik yüklemeye güvenmeye yetecek kadar kontrol ettiği iki büyük projem vardı.
İlk. Otomatik yükleme harika. Gerektiği için endişelenmemek nispeten iyi bir şey.
İşte birkaç projede kullandığım bir yükleyici. Sınıfın önce geçerli ad alanında olduğundan emin olmak için kontrol eder, sonra yapmazsa kefalet öder. Oradan sadece sınıfı bulmak için bazı string manipülasyon var.
<?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);
}
Kişi bunu ad alanları olmadan kullanmak için kolayca uyarlayabilir. Eklentinizin / temalarının sınıflarını eşit olarak öneklediğinizi varsayarsak, sadece bu öneki test edebilirsiniz. Sonra sınıf adındaki alt çizgi dizini ayırıcılar için yer tutucu olarak kullanın. Çok fazla sınıf kullanıyorsanız, bir tür sınıf haritası otomatik yükleyici kullanmak isteyebilirsiniz.
İsim Alanları ve Kancalar
WordPress 'hooks sistemi , fonksiyon isimlerini dizge olarak alan ve (ve daha sonra ) işlev çağrısı yapıldığında onları çağıran call_user_func
(ve call_user_func_array
) kullanarak çalışır .do_action
call_user_func
Ad alanlarıyla, bu, ad alanını içeren tam işlevli işlev adlarını kancalara geçirmeniz gerektiği anlamına gelir.
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', 'WPSE\\SomeNameSpace\\the_function');
function the_function()
{
return 'did stuff';
}
Bunu yapmak __NAMESPACE__
istersen , büyüyü liberal bir şekilde kullanmak, muhtemelen daha iyi olur .
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', __NAMESPACE__ . '\\the_function');
function the_function()
{
return 'did stuff';
}
Kancanızı daima sınıfa koyarsanız, daha kolaydır. Standart bir sınıf örneği yaratır ve yapıcıdaki tüm kancalar $this
iyi çalışır.
<?php
namespace WPSE\SomeNameSpace;
new Plugin;
class Plugin
{
function __construct()
{
add_action('plugins_loaded', array($this, 'loaded'));
}
function loaded()
{
// this works!
}
}
Yapmak istediğim gibi statik yöntemler kullanıyorsanız, dizinin ilk argümanı olarak tam sınıf adını girmeniz gerekir. Bu çok iş, yani sihir __CLASS__
sabitini kullanabilirsin ya da 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!
}
}
Çekirdek Sınıfları Kullanma
PHP'nin sınıf adı çözünürlüğü biraz riskli. Çekirdek WP sınıflarını kullanacaksanız ( WP_Widget
aşağıdaki örnekte) use
ifadeler sağlamalısınız .
use \WP_Widget;
class MyWidget extends WP_Widget
{
// ...
}
Veya tam nitelikli sınıf adını kullanabilirsiniz - temelde sadece ters eğik çizgi ile önek.
<?php
namespace WPSE\SomeNameSpace;
class MyWidget extends \WP_Widget
{
// ...
}
tanımlar
Bu daha genel PHP, ama beni ısırdı, işte burada.
Eklentinizin yolu gibi sık kullanacağınız şeyleri tanımlamak isteyebilirsiniz. Tanım deyimini kullanmak, ad alanını tanımlamanın ilk argümanına açıkça iletmediğiniz sürece, şeyleri kök ad alanına koyar.
<?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__));
const
Anahtar kelimeyi, PHP 5.3 plus ile bir dosyanın kök düzeyinde de kullanabilirsiniz . consts
s her zaman geçerli ad alanındadır, ancak define
aramadan daha az esnektir .
<?php
namespace WPSE\SomeNameSpace;
// in the current namespace
const MY_CONST = 1;
// this won't work!
const MY_PATH = plugin_dir_path(__FILE__);
Lütfen sahip olabileceğiniz diğer ipuçlarını eklemekten çekinmeyin!