मैं OOP शैली के साथ एक नया प्लगइन शुरू कर रहा हूं
आपके लिए does OOP शैली ’का क्या अर्थ है? एक वर्ग के बयान के साथ अपने सभी कार्यों को लपेटना? फिर आप गलत कर रहे हैं। आप वर्ग को नामस्थान के रूप में याद करते हैं।
और मुझे पता चला कि मेरे मुख्य वर्ग को बहुत अधिक अस्थिर किया जा रहा है
है ना?
class Foo
{
public function __construct() {
// assuming your wp-content dir is writeable
$filename = sprintf( WP_CONTENT_DIR . '/dummyfile-%d.txt', time() );
$handle = fopen( $filename, 'w' );
if ( $handle ) {
fputs( $handle, '-' );
fclose( $handle );
}
}
}
add_action( 'plugins_loaded', function() { new Foo(); } );
इसे आज़माएं और बनाई गई फ़ाइलों की संख्या की गणना करें। यदि मैं इसे आज़माता हूं, तो प्रत्येक पृष्ठ अनुरोध के लिए बनाई गई एक फ़ाइल है। इसका अर्थ है, प्रत्येक पृष्ठ अनुरोध के लिए फू कक्षा का केवल एक उदाहरण ।
चलो एक कार्रवाई कॉल का प्रयास करें
class Foo
{
public function __construct() {
$this->write_file( 'in_constructor' );
add_action( 'init', array( $this, 'action_test' ), 10, 0 );
}
public function action_test() {
$this->write_file( 'in_method_with_action_call' );
}
public function write_file( $filename ) {
// assuming your wp-content dir is writeable
$counter = 1;
$fname = sprintf( WP_CONTENT_DIR . '/%s-%d.txt', $filename, $counter );
if ( file_exists( $fname ) ) {
preg_match( '/(\d)\.txt/is', $fname, $match );
if ( isset( $match[1] ) ) {
$counter = (int) $match[1] + 1;
$fname = sprintf( WP_CONTENT_DIR . '/%s-%d.txt', $filename, $counter );
}
}
$handle = fopen( $fname, 'a+' );
if ( $handle ) {
fputs( $handle, '-' );
fclose( $handle );
} else {
throw new Exception( "Cannot open file {$fname} for writing" );
}
}
}
add_action( 'plugins_loaded', function() { new Foo(); } );
अगर मैं अपने wp-content dir में देखता हूं, तो मुझे दो फाइलें मिलीं। अब और नहीं। एक फ़ाइल तब बनाई जाती है जब वर्ग आवृत्ति बनाई जाती है। और एक तब बनाया जाता है जब एक्शन कॉल किया जाता है।
ठीक है, चलो हमारे उदाहरण के साथ कुछ बेवकूफी करते हैं। add_action( 'plugins_loaded', .. )
इसके बजाय इस कोड को निकालें और जोड़ें:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
आप कितनी फाइलों की उम्मीद करते हैं? मुझे दो की उम्मीद है। कंस्ट्रक्टर से एक, विधि से एक।
एक नया उदाहरण केवल तब बनाया जाता है जब new
ऑपरेटर का उपयोग किया जाता है।
add_action( 'plugins_loaded', 'new_foo', 10, 0 );
function new_foo() {
// first instance
new Foo();
}
function bar( $foo ) {
$baz = $foo;
return $baz;
}
// second instance here!!
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
अब मैं चार फाइलें गिनता हूं। दो निर्माणकर्ता से और दो विधि से। ऐसा इसलिए है क्योंकि वर्डप्रेस में पहले प्लगइन शामिल होता है और फिर एक्शन हुक होता है plugins_loaded
।
सबसे अच्छा अभ्यास यह है कि plugins_loaded
किसी फंक्शन से बाहर एक उदाहरण बनाने के बजाय एक्शन हुक का उपयोग करें क्योंकि, यदि प्लगइन फ़ाइल को कहीं भी शामिल किया गया है (जैसे आपके प्लगइन की किसी अन्य फ़ाइल में), तो हर बार फ़ाइल को शामिल करने के लिए क्लास का एक नया उदाहरण बनाया जाता है। कार्रवाई हुक plugins_loaded
प्रत्येक पृष्ठ अनुरोध के लिए केवल एक बार किया जाता है।