มีเอกสาร Life Cycle Plugin หรือไม่?


11

มีเอกสารบางอย่างที่อธิบายวงจรชีวิตของปลั๊กอินหรือไม่?

ฉันเริ่มปลั๊กอินใหม่ที่มีสไตล์ OOP และฉันเพิ่งค้นพบว่าคลาสหลักของฉันได้รับการติดตั้งจำนวนมาก (ขอบคุณ Xdebug และ Netbeans)
ฉันสงสัยว่าทำไมและมันทำให้ฉันรำคาญเพราะฉันกำลังติดตั้งวัตถุ Dropbox-API และฉันไม่คิดว่า WordPress จะทำการติดตั้งคลาสหลักของฉันมากนัก

ฉันไม่พบสิ่งใดที่เกี่ยวข้องกับวงจรชีวิตปลั๊กอินใน Codex หรือบน Google


และที่นี่คุณค้นหาที่นี่หรือไม่ :)
brasofilo

20
YouPorn เสมอสามารถกำหนดระดับของคุณเป็นเดี่ยวstackoverflow.com/questions/203336/...
Bainternet

1
ขอบคุณ ฉันไม่ได้คิดถึง 'แนวปฏิบัติที่ดีที่สุด' ฉันอ่านสิ่งต่าง ๆ มากมายบน Codex รวมถึงแนวทางการเข้ารหัส แต่มันไม่ได้อยู่ที่นี่ .. จะลองซิงเกิลตอนนั้น แต่ถึงกระนั้นฉันก็พบว่ามันแปลกที่ปลั๊กอิน php นั้นถูกเรียกหลายครั้ง .. ไม่? Bainternet ระวังด้วยการเติมข้อความอัตโนมัติของคุณ :)
RitonLaJoie

brasofilo การทำซิงเกิลตันจะช่วยได้ แต่ไม่ตอบคำถามซึ่งก็คือ: ทำไมโค้ดจึงถูกเรียกใช้หลายครั้งภายในปลั๊กอินของฉัน คลาส OO ใน URL ที่คุณเชื่อมโยงนั้นทำในสิ่งที่ฉันทำอย่างแน่นอน
RitonLaJoie

2
เพิ่งต้อง +1 คำถาม เพียงเพื่อความคิดเห็นและ upvotes: D
kaiser

คำตอบ:


3

ฉันกำลังเริ่มปลั๊กอินใหม่ที่มีสไตล์ OOP

'OOP style' หมายถึงอะไรสำหรับคุณ ห่อฟังก์ชั่นทั้งหมดของคุณด้วยคำสั่งคลาส? จากนั้นคุณทำผิด คุณคิดถึงคลาสเป็น namespace

และฉันเพิ่งค้นพบว่าชั้นเรียนหลักของฉันกำลังได้รับการดัดแปลงมากมาย

ฮะ?

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(); } );

ลองและนับจำนวนไฟล์ที่สร้าง หากฉันลองใช้จะมีไฟล์หนึ่งไฟล์ที่สร้างขึ้นสำหรับคำขอแต่ละหน้า ซึ่งหมายความว่ามีเพียงอินสแตนซ์เดียวของคลาส 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(); } );

หากฉันดู dir เนื้อหา wp ของฉันฉันพบสองไฟล์ ไม่มีอีกแล้ว หนึ่งไฟล์ถูกสร้างขึ้นเมื่อสร้างอินสแตนซ์ของคลาส และหนึ่งจะถูกสร้างขึ้นเมื่อมีการเรียกการดำเนินการ

ตกลงเรามาทำสิ่งที่งี่เง่ากับตัวอย่างของเรา ลบ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 );

ตอนนี้ฉันนับสี่ไฟล์ สองจากตัวสร้างและสองจากวิธีการ นี่เป็นเพราะ WordPress มีปลั๊กอินก่อนแล้วจึงทำการเชื่อมplugins_loadedต่อ

แนวทางปฏิบัติที่ดีที่สุดคือการใช้ action hook plugins_loadedแทนที่จะสร้างอินสแตนซ์ออกจากฟังก์ชั่นเพราะหากไฟล์ปลั๊กอินถูกรวมไว้ที่ใดก็ได้ (เช่นในไฟล์อื่นของปลั๊กอินของคุณ) อินสแตนซ์ใหม่ของคลาสจะถูกสร้างขึ้นทุกครั้งที่รวมไฟล์ เบ็ดการดำเนินการplugins_loadedจะทำเพียงครั้งเดียวสำหรับทุกการร้องขอหน้า


0

สิ่งที่อาจเกิดขึ้นคือคุณส่งสำเนาของคลาสให้กับตัวกรองหรือการดำเนินการ ตัวอย่างเช่นหากคุณต้องการแก้ไขตัวแปรคลาสโดยตรงภายใน hook หรือตัวกรองคุณควรส่ง hook โดยอ้างอิง

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 ไม่จำเป็นต้องผ่านมันเป็นข้อมูลอ้างอิง
Ralf912

ฉันยืนแก้ไข
Arevico
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.