เมื่อใดก็ตามที่ปลั๊กอินสร้างnew MyClass();
มันควรจะกำหนดให้กับตัวแปรที่มีชื่อไม่ซ้ำกัน ด้วยวิธีนี้สามารถเข้าถึงตัวอย่างของคลาสได้
ดังนั้นถ้าเขาทำเช่น$myclass = new MyClass();
นั้นคุณสามารถทำได้:
global $myclass;
remove_action( 'wp_footer', array( $myclass, 'my_action' ) );
สิ่งนี้ทำงานได้เนื่องจากปลั๊กอินรวมอยู่ในเนมสเปซส่วนกลางดังนั้นการประกาศตัวแปรโดยนัยในเนื้อหาหลักของปลั๊กอินจึงเป็นตัวแปรทั่วโลก
หากปลั๊กอินไม่ได้บันทึกตัวระบุของคลาสใหม่ที่ไหนสักแห่งในทางเทคนิคแล้วนั่นเป็นข้อบกพร่อง หนึ่งในหลักการทั่วไปของการเขียนโปรแกรมเชิงวัตถุคือวัตถุที่ไม่ได้ถูกอ้างอิงโดยตัวแปรบางแห่งที่อยู่ภายใต้การทำความสะอาดหรือกำจัด
ตอนนี้ PHP โดยเฉพาะอย่างยิ่งไม่ได้ทำสิ่งนี้เหมือน Java เพราะ PHP เป็นการใช้งาน OOP แบบครึ่งๆกลางๆ ตัวแปรอินสแตนซ์เป็นเพียงสตริงที่มีชื่อวัตถุที่ไม่ซ้ำกันในพวกเขาเรียงลำดับของสิ่ง พวกเขาทำงานเพียงเพราะวิธีการที่ชื่อฟังก์ชั่นตัวแปรทำงานร่วมกับ->
ผู้ประกอบการ ดังนั้นการทำเช่นnew class()
นั้นสามารถทำงานได้อย่างสมบูรณ์แบบเพียงแค่โง่เขลา :)
new class();
ดังนั้นบรรทัดล่างไม่เคยทำ ทำ$var = new class();
และทำให้สามารถเข้าถึง $ var ในบางวิธีเพื่อให้บิตอื่นอ้างอิง
แก้ไข: ปีต่อมา
สิ่งหนึ่งที่ฉันได้เห็นปลั๊กอินจำนวนมากที่ทำคือใช้สิ่งที่คล้ายกับรูปแบบ "ซิงเกิล" พวกเขาสร้างเมธอด getInstance () เพื่อรับอินสแตนซ์เดียวของคลาส นี่อาจเป็นทางออกที่ดีที่สุดที่ฉันเคยเห็น ตัวอย่างปลั๊กอิน:
class ExamplePlugin
{
protected static $instance = NULL;
public static function getInstance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
}
ครั้งแรกที่เรียกว่า getInstance () มันจะยกระดับชั้นและบันทึกพอยน์เตอร์ คุณสามารถใช้สิ่งนั้นเพื่อขอการกระทำ
ปัญหาหนึ่งที่เกิดขึ้นคือคุณไม่สามารถใช้ getInstance () ภายใน Constructor ได้หากคุณใช้สิ่งนี้ นี่เป็นเพราะการเรียกตัวสร้างใหม่ก่อนที่จะตั้งค่า $ อินสแตนซ์ดังนั้นการเรียกใช้ getInstance () จากตัวสร้างจะนำไปสู่การวนซ้ำไม่สิ้นสุดและแบ่งทุกอย่าง
วิธีหนึ่งคือไม่ใช้ตัวสร้าง (หรืออย่างน้อยไม่ใช้ getInstance () ภายใน) แต่มีฟังก์ชัน "init" ในชั้นเรียนอย่างชัดเจนเพื่อตั้งค่าการกระทำของคุณ แบบนี้:
public static function init() {
add_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
}
ด้วยบางสิ่งเช่นนี้ในตอนท้ายของไฟล์หลังจากที่คลาสได้ถูกกำหนดไว้ทั้งหมดแล้วการทำให้อินสแตนซ์ของปลั๊กอินกลายเป็นเรื่องง่ายอย่างนี้:
ExamplePlugin::init();
เริ่มต้นแล้วเพื่อเพิ่มการกระทำของคุณและเพื่อให้มันเรียกใช้ getInstance () ซึ่งจะยกระดับชั้นเรียนและทำให้แน่ใจว่ามีเพียงหนึ่งในนั้น หากคุณไม่มีฟังก์ชั่นเริ่มต้นคุณจะต้องทำสิ่งนี้เพื่อยกตัวอย่างชั้นเรียนในตอนแรกแทน:
ExamplePlugin::getInstance();
หากต้องการตอบคำถามเดิมการลบการกระทำของ hook นั้นจากภายนอก (หรือที่รู้จักในปลั๊กอินอื่น) สามารถทำได้ดังนี้:
remove_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
ใส่ลงไปในสิ่งที่ติดกับplugins_loaded
ตะขอการกระทำและมันจะยกเลิกการกระทำที่ถูกยึดโดยปลั๊กอินดั้งเดิม