ไม่คุณไม่สามารถ 'กำหนดค่าเริ่มต้น' หรือสร้างอินสแตนซ์ของคลาสผ่านทาง hook ไม่ใช่โดยตรง ต้องมีรหัสเพิ่มเติมอยู่เสมอ (และไม่ใช่สิ่งที่พึงปรารถนาที่จะทำเช่นนั้นเมื่อคุณเปิดเวิร์มกระป๋องสำหรับตัวคุณเอง
นี่เป็นวิธีที่ดีกว่าในการทำ:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
แน่นอนว่าหนึ่งสามารถสร้างคลาสอินเตอร์เฟสเพื่อทำให้ง่ายขึ้นสำหรับเคสทั่วไปยิ่งขึ้นไปอีก:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
โปรดทราบว่าในฐานะที่เป็นอินเทอร์เฟซคุณไม่สามารถสร้างวัตถุประเภทนี้โดยตรง แต่คุณสามารถสร้างคลาสย่อยโดยให้คุณพูดว่า:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
ซึ่งจะเพิ่ม hooks ทั้งหมดโดยอัตโนมัติคุณเพียงแค่ต้องกำหนดสิ่งที่ถูกทำในคลาสย่อยและสร้างมันขึ้นมา!
ในการก่อสร้าง
ฉันจะไม่เพิ่มนวกรรมิกของฟังก์ชั่นฮุคมันเป็นการฝึกฝนที่ไม่ดีและสามารถนำไปสู่เหตุการณ์ที่ผิดปกติมากมาย ในภาษาส่วนใหญ่คอนสตรัคเตอร์จะส่งคืนออบเจ็กต์ที่กำลังถูกอินสแตนซ์ดังนั้นหากตะขอของคุณต้องการส่งคืนบางอย่างในตัวกรองมันจะไม่ส่งคืนตัวแปรที่กรองตามที่คุณต้องการ แต่มันจะส่งคืนคลาสอ็อบเจ็กต์
การโทรหาคอนสตรัคเตอร์หรือ destructor นั้นเป็นวิธีการเขียนโปรแกรมที่แย่มาก ๆ ไม่ว่าคุณจะใช้ภาษาใดและไม่ควรทำ
คอนสตรัคเตอร์ควรสร้างวัตถุเพื่อเริ่มต้นพร้อมใช้งานไม่ใช่เพื่อการทำงานจริง งานที่จะทำโดยวัตถุควรอยู่ในฟังก์ชันแยกต่างหาก
วิธีการเรียนแบบคงที่และไม่จำเป็นต้องยกตัวอย่าง / เริ่มต้นเลย
หากวิธีการเรียนของคุณเป็นวิธีการเรียนแบบคงที่คุณสามารถส่งชื่อของชั้นเรียนในคำพูดมากกว่า$this
ที่แสดงด้านล่าง:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
การปิด & PHP 5.3
น่าเศร้าที่คุณไม่สามารถหลีกเลี่ยงสายที่สร้างคลาสใหม่ได้ ทางออกเดียวที่จะข้ามมันจะเกี่ยวข้องกับรหัสจานหม้อไอน้ำที่ยังคงมีบรรทัดนั้นและจะต้องมี PHP 5.3+ เช่น:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
ณ จุดนี้คุณอาจข้ามคลาสและใช้ฟังก์ชัน:
add_action('admin_init',function(){
// do stuff
});
แต่จำไว้ว่าตอนนี้คุณได้เปิดตัวอสุรกายของฟังก์ชั่นนิรนาม ไม่มีวิธีที่จะลบการดำเนินการข้างต้นโดยใช้remove_action
และสิ่งนี้สามารถและทำให้เกิดความเจ็บปวดอย่างมากสำหรับนักพัฒนาที่ต้องทำงานกับรหัสประชาชนอื่น ๆ
บนเครื่องหมาย
คุณอาจเห็นการกระทำที่ใช้ในลักษณะนี้:
array( &$this, 'getStuffDone' );
นี่มันแย่มาก &
ถูกเพิ่มกลับมาใน PHP 4 เมื่อวัตถุถูกส่งผ่านเป็นค่าไม่ใช่การอ้างอิง PHP 4 มีอายุมากกว่าทศวรรษและไม่ได้รับการสนับสนุนจาก WordPress ในเวลานาน
นอกจากนี้ไม่มีเหตุผลที่จะใช้&this
เมื่อมีการเพิ่มตะขอและตัวกรองและลบอ้างอิงจะทำให้เกิดปัญหาใด ๆ และอาจปรับปรุงความเข้ากันได้กับรุ่นอนาคตของ PHP
ใช้สิ่งนี้แทน:
array( $this, 'getStuffDone' );