वहाँ एक प्लगइन जीवन चक्र प्रलेखन है?


11

क्या कहीं कोई दस्तावेज है जो बताता है कि प्लगइन्स का जीवन चक्र क्या है?

मैं OOP शैली के साथ एक नया प्लगइन शुरू कर रहा हूं, और मुझे अभी पता चला है कि मेरे मुख्य वर्ग को बहुत अधिक मात्रा में प्रेरित किया जा रहा है (Xdebug और Netbeans के लिए धन्यवाद)।
मुझे आश्चर्य है कि क्यों, और यह मुझे गुस्सा दिलाता है क्योंकि मैं एक ड्रॉपबॉक्स-एपीआई ऑब्जेक्ट को इंस्टाल कर रहा हूं, और मैंने वास्तव में नहीं सोचा था कि वर्डप्रेस सिर्फ मेरे मुख्य वर्ग को इतना ही प्रेरित करेगा।

मुझे कोडेक्स में प्लगइन्स जीवन चक्र से संबंधित कुछ भी नहीं मिला है और न ही Google पर।


और यहां, क्या आपने यहां खोजा है ? :)
ब्रसोफिलो

20
YouPorn हमेशा एक सिंगलटन के रूप में अपने वर्ग को परिभाषित कर सकते हैं stackoverflow.com/questions/203336/...
Bainternet

1
धन्यवाद। मैंने 'सर्वोत्तम प्रथाओं' के बारे में नहीं सोचा था। कोडिंग दिशानिर्देशों सहित कोडेक्स पर मैंने बहुत सी चीजें पढ़ीं, लेकिन यह यहां नहीं है .. तब सिंगलटन की कोशिश करेंगे, लेकिन फिर भी, मुझे यह अजीब लगता है कि प्लगइन php को कई बार कहा जाता है .. नहीं? बैनटेनट अपने स्वत: पूर्ण के साथ सावधान रहें :)
रिटनलो जॉय

brasofilo, एक सिंगलटन बनाने में मदद करेगा, लेकिन इस सवाल का जवाब नहीं देता है कि: कोड मेरे प्लगइन के अंदर कई बार क्यों चलाया जाता है? आपके द्वारा लिंक किए गए URL में OO वर्ग ठीक वही कर रहा है जो मैं करता हूं
RitonLaJoie

2
बस सवाल +1 करना था। सिर्फ टिप्पणी और upvotes के लिए: D
kaiser

जवाबों:


3

मैं 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प्रत्येक पृष्ठ अनुरोध के लिए केवल एक बार किया जाता है।


0

क्या हो सकता है कि आप एक फ़िल्टर या एक्शन के लिए क्लास की एक कॉपी पास करें। उदाहरण के लिए, यदि आप सीधे हुक के अंदर वर्ग चर को संशोधित करना चाहते हैं या फ़िल्टर आपको संदर्भ द्वारा हुक को भी पास करना चाहिए

add_action("some_action",array(&$this,"somefunction"))

के बजाय

add_action("some_action",array($this,"somefunction"))

जैसा कि bainternet द्वारा उल्लेख किया गया है, आप यह सुनिश्चित करने के लिए एक सिंगलटन पैटर्न का भी उपयोग कर सकते हैं कि एक विशिष्ट वस्तु को केवल एक बार इंस्टेंट किया जाता है (आगे की कॉल उस ऑब्जेक्ट के संदर्भ को वापस कर देती है)।

आप कुछ कार्यों को स्थिर बनाने पर भी विचार कर सकते हैं (उन्हें स्थिर कीवर्ड देकर) यह आमतौर पर 'सहायक' जैसे कार्यों के लिए किया जाता है, जो बाकी कक्षा के साथ बातचीत नहीं करते हैं। क्लास के बिना इंस्टैंट किए बिना स्टेटिक तरीकों को बुलाया जा सकता है।

आप किसी क्रिया / फ़िल्टर के लिए स्थिर कार्य भी पास कर सकते हैं:

add_action("some_action",array("ClassName","Method"))

मैंने http://codex.wordpress.org/Plugin_API/Action_Reference को भी चेक किया और पाया कि प्लगइन्स को केवल दो चरणों में अनुरोध में लोड किया जा सकता है (muplugins_loaded और plugins_loaded)।


3
जब किसी ऑब्जेक्ट को तर्क द्वारा भेजा जाता है, तो किसी अन्य चर को लौटाया या असाइन किया जाता है, विभिन्न चर एलियास नहीं होते हैं: वे पहचानकर्ता की एक प्रति पकड़ते हैं, जो उसी ऑब्जेक्ट को इंगित करता है। PHP मैनुअल से । एक्शन कॉल या फ़िल्टर में, क्लास को तर्क के रूप में भेजा जाता है। PHP5 के बाद से इसे संदर्भ के रूप में पारित करने की आवश्यकता नहीं है।
राल्फ

मैं सही खड़ा हूं
Arevico
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.