ठीक है, मेरे पास दो बड़ी परियोजनाएँ हैं जहाँ मैं सर्वर के नियंत्रण से लेकर नेमस्पेस तक और ऑटोलॉडिंग पर निर्भर हूं।
शुरुआत से। ऑटोलडिंग कमाल की है। आवश्यकता के बारे में चिंता न करना अपेक्षाकृत अच्छी बात है।
यहाँ एक लोडर है जिसका उपयोग मैं कुछ परियोजनाओं पर कर रहा हूँ। यह सुनिश्चित करने के लिए जाँच करता है कि कक्षा पहले नामस्थान में है, फिर नहीं तो घंटी। वहाँ से यह वर्ग खोजने के लिए कुछ स्ट्रिंग हेरफेर है।
<?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);
}
कोई भी नाम-स्थान के बिना उपयोग के लिए इसे आसानी से अनुकूलित कर सकता है। यदि आप अपने प्लगइन / थीम की कक्षाओं को समान रूप से उपसर्ग मानते हैं, तो आप उस उपसर्ग के लिए परीक्षण कर सकते हैं। फिर निर्देशिका विभाजकों के लिए प्लेसहोल्डर के रूप में वर्ग नाम में अंडरस्कोर का उपयोग करें। यदि आप बहुत सारी कक्षाओं का उपयोग कर रहे हैं, तो आप कुछ प्रकार के क्लासमेट ऑटोलैडर का उपयोग करना चाहेंगे।
नाम और हुक
वर्डप्रेस का हुक सिस्टम call_user_func
(और call_user_func_array
) का उपयोग करके काम करता है , जो फ़ंक्शन नामों को स्ट्रिंग्स के रूप में लेता है और जब do_action
(और बाद में, call_user_func
) फ़ंक्शन कॉल किया जाता है , तो उन्हें कॉल करता है।
नेमस्पेस के साथ, इसका मतलब है कि आपको पूरी तरह से योग्य फ़ंक्शन नामों को पारित करने की आवश्यकता होगी जिसमें नामस्थान को हुक में शामिल किया गया है।
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', 'WPSE\\SomeNameSpace\\the_function');
function the_function()
{
return 'did stuff';
}
__NAMESPACE__
यदि आप ऐसा करना चाहते हैं तो जादू का निरंतर उपयोग करना बेहतर होगा ।
<?php
namespace WPSE\SomeNameSpace;
add_filter('some_filter', __NAMESPACE__ . '\\the_function');
function the_function()
{
return 'did stuff';
}
यदि आप हमेशा अपने हुक को कक्षाओं में रखते हैं, तो यह आसान है। मानक एक वर्ग का उदाहरण बनाता है और $this
ठीक काम करता है के साथ कंस्ट्रक्टर में सभी हुक ।
<?php
namespace WPSE\SomeNameSpace;
new Plugin;
class Plugin
{
function __construct()
{
add_action('plugins_loaded', array($this, 'loaded'));
}
function loaded()
{
// this works!
}
}
यदि आप स्थिर विधियों का उपयोग करते हैं जैसे मैं करना चाहता हूं, तो आपको सरणी के पहले तर्क के रूप में पूरी तरह से योग्य वर्ग नाम पास करना होगा। यह बहुत काम है, इसलिए आप बस जादू का उपयोग कर सकते हैं __CLASS__
या 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!
}
}
कोर कक्षाओं का उपयोग करना
PHP का क्लासनाम रिज़ॉल्यूशन थोड़ा विस्की है। यदि आप कोर WP कक्षाओं का उपयोग करने जा रहे हैं ( WP_Widget
नीचे दिए गए उदाहरण में) तो आपको use
कथन प्रदान करने होंगे।
use \WP_Widget;
class MyWidget extends WP_Widget
{
// ...
}
या आप पूरी तरह से योग्य वर्ग नाम का उपयोग कर सकते हैं - मूल रूप से इसे बैकस्लैश के साथ उपसर्ग कर सकते हैं।
<?php
namespace WPSE\SomeNameSpace;
class MyWidget extends \WP_Widget
{
// ...
}
परिभाषित करता है
यह अधिक सामान्य PHP है, लेकिन यह मुझे बिट करता है, इसलिए यहां यह है।
आप उन चीजों को परिभाषित करना चाह सकते हैं जिनका आप अक्सर उपयोग करते हैं, जैसे आपके प्लगइन का मार्ग। डिफाइन स्टेटमेंट का उपयोग रूट नेमस्पेस में चीजों को डालता है जब तक कि आप स्पष्ट रूप से नाम स्थान को डिफेंस के पहले तर्क में पास नहीं करते हैं।
<?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
PHP 5.3 प्लस के साथ फ़ाइल के रूट स्तर पर भी कीवर्ड का उपयोग कर सकते हैं । consts
s हमेशा वर्तमान नामस्थान में होते हैं, लेकिन कम लचीले होते हैं जो एक define
कॉल है।
<?php
namespace WPSE\SomeNameSpace;
// in the current namespace
const MY_CONST = 1;
// this won't work!
const MY_PATH = plugin_dir_path(__FILE__);
कृपया किसी भी अन्य युक्तियों को जोड़ने के लिए स्वतंत्र महसूस करें!