มีข้อ จำกัด ในการขอความสำคัญหรือไม่


9

เมื่อฉันต้องการกรองหรือการกระทำของฉันเบ็ดแทนที่คนอื่น ๆ 999ทั้งหมดผมจะกำหนดลำดับความสำคัญของ อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันได้เห็นบางคนใช้ค่าสุดขีดสำหรับลำดับความสำคัญเช่น20000และแม้กระทั่ง99999

นอกจากความจริงที่ว่าการใช้ลำดับความสำคัญสูงนี้ไร้สาระพวกเขาจะทำงานจริงหรือไม่ มีข้อ จำกัด ในการขอความสำคัญหรือไม่ จะเกิดอะไรขึ้นถ้าเกินขีด จำกัด ? มีความแตกต่างด้านประสิทธิภาพเมื่อใช้ลำดับความสำคัญสูงสุดหรือไม่

อัปเดต: @harkeแนะนำให้ใช้กับ Stack Overflowที่จำนวนถูก จำกัด โดยPHP_INT_MAX


คุณไม่ได้ลิงก์ไปยังคำตอบโดย@hakreที่พูดถึงเรื่องนี้หรือไม่? มันควรจะเป็นส่วนหนึ่งของ Q และอื่น ๆ ตามนำที่เขาให้ฉันสงสัยว่าเขาจริงจังรู้หนึ่งหรือสองสิ่ง ...
brasofilo

คุณหมายถึงคำตอบอะไร?
เชียม

คำตอบ:


13

ไม่มีข้อ จำกัด และไม่มีการลงโทษประสิทธิภาพ เพื่อให้เข้าใจว่าทำไมคุณต้องเข้าใจว่าตะขอทั้งหมดถูกเก็บไว้ในระบบนิเวศ WP อย่างไร

ก่อนอื่นคุณต้องเข้าใจว่าตะขอทั้งหมดถูกเก็บไว้ที่ไหนและทำอย่างไร hooks สำหรับตัวกรองและการกระทำทั้งหมดจะถูกเก็บไว้ในตัวแปรทั่วโลกที่เรียกว่าwp_filterใช่ใช่การกระทำ hooks จะถูกเก็บไว้ในตัวแปรนี้เช่นกัน ตัวแปรนี้เป็นอาเรย์ที่เกี่ยวข้องโดยที่สำคัญคือชื่อของการกระทำหรือตัวกรองและค่าเป็นอาเรย์ที่เชื่อมโยงกันอีกอันหนึ่ง ตัวอย่างเช่นลองมาดูการกระทำ 'init' ในขั้นตอนนี้เราจะเห็นโครงสร้างต่อไปนี้:

$wp_filter = array(
    'init' => array(...),
);

อาร์เรย์ย่อยนี้มีคีย์ตัวเลขและค่าเป็นอาร์เรย์ ปุ่มตัวเลขเป็นสิ่งสำคัญของเรา อาร์เรย์ที่เกี่ยวข้องกับแป้นตัวเลขมีรายการ hooks ที่มีลำดับความสำคัญเท่ากัน ดังนั้นหากเราโทรadd_action( 'init', 'wpse8170_my_first_init', 20 )แล้วโทรออกadd_action( 'init', 'wpse8170_my_second_init', 20 )และโทรในที่สุดadd_action( 'init', 'wpse8170_my_third_init', 10 )ตัวอย่างของเราจะมีลักษณะดังนี้:

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

ตอนนี้เมื่อinitการกระทำถูกเรียกใช้ hooks ทั้งหมดจะถูกจัดเรียงด้วยการใช้งานksortฟังก์ชั่นและอาร์เรย์ของเราตอนนี้:

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

และตะขอทั้งหมดจะถูกดำเนินการในคิวนี้: ครั้งแรก'wpse8170_my_third_init'แล้วและในที่สุด'wpse8170_my_first_init''wpse8170_my_second_init'

ดังนั้นคุณจะเห็นว่าไม่มีข้อ จำกัด และการลงโทษและคุณสามารถใช้ค่าใด ๆ ที่ยอมรับได้ว่าเป็นกุญแจสำคัญสำหรับอาร์เรย์ที่เกี่ยวข้องโดยสภาพแวดล้อม PHP ของคุณ


2
max( $priorities ) + 1PHP_INT_MAXจะล้มเหลวถ้าหมายเลขสุดท้ายจะมีค่าเท่ากับ ในกรณีนั้นคุณต้องแปลงค่าให้เป็นสตริงและเพิ่มบางสิ่งลงไป
fuxia

@toscho ใช่เห็นด้วย อัปเดตตัวอย่างข้อมูลโบนัส
Eugene Manuilov

2
"โบนัส" เป็นความคิดที่ไม่ดีในกรณีที่คำจำกัดความ$wp_filterเปลี่ยนแปลงตลอดเวลา มันไม่ได้ตั้งใจที่จะใช้โดยตรงโดยปลั๊กอิน เราได้ทำการปรับเปลี่ยนในอดีต (ส่วนใหญ่สำหรับเหตุผลด้านประสิทธิภาพโดยบังเอิญ)
Andrew Nacin

@AndrewNacin ตกลงฉันได้ลบมันเป็นมันทำให้เกิดคำถามมากเกินไป :)
ยู Manuilov

6

มันเป็นจำนวนเต็มดังนั้นในระบบ PHP แบบ 32 บิตจะถูก จำกัด ที่ -2147483648 ถึง 2147483647 และบน 64 บิต PHP จะถูก จำกัด ที่ -9223372036854775808 ถึง 9223372036854775807

แก้ไข: ไม่มีการลงโทษประสิทธิภาพเป็นจำนวนเต็ม

แต่ ... จริงจังเหรอ? :)


ฉันเข้าใจว่ามันเป็นจำนวนเต็ม แต่ฉันกำลังพูดถึงกลไกของ hook ที่แท้จริง ฉันได้ยินคนพูดว่าการใช้ตะขอที่มีขนาดใหญ่เกินไปจะทำให้ตะขอล้มเหลวอย่างสมบูรณ์และการโทรกลับจะไม่ถูกดำเนินการ
shea

Who? เมื่อไหร่? มันเป็นเพียงดัชนีเข้าสู่อาเรย์และอาเรย์เบาบางดังนั้นจึงมีผลกระทบเล็กน้อย แต่โดยความจริงแล้วตัวเลขขนาดใหญ่ค่อนข้างเป็นตัวบ่งชี้ว่าไม่ได้เข้าใจปัญหา (เช่นเมามันพยายามทำเลือดที่อาจใช้งานได้!)
webaware

2

@shea - การกระทำของ WordPress ทำงานอย่างตรงไปตรงมาในแบบที่คุณคิด ตัวเลขที่มีลำดับความสำคัญสูงกว่าจะไม่แทนที่คนอื่นและการใช้งาน PHP_INT_MAX ไม่ใช่ความพยายาม "สุดขีด" ที่จะบังคับให้การกระทำ / ตัวกรองนี้ทำงานก่อนที่ผู้อื่นจะมาถึง

ในการทำให้การดำเนินการ / ตัวกรองของคุณอยู่ด้านบนสุดของคำสั่งการดำเนินการคุณจะต้องใช้ลำดับความสำคัญเป็น 0

PHP_INT_MAX นั้นอยู่ฝั่งตรงข้าม มันถูกใช้เมื่อคุณต้องการให้แอ็คชั่น / ฟิลเตอร์ของคุณรันได้หลังจาก hooks อื่น ๆ (ลำดับความสำคัญปกติ) เสร็จสมบูรณ์แล้ว


1
ใช่นั่นคือความคิดที่แน่นอน ตัวกรองสุดท้ายที่รันบน hook จะสามารถแก้ไขตัวแปรได้โดยไม่ต้องกังวลเกี่ยวกับการเปลี่ยนแปลงใด ๆ เพิ่มเติม
she

นอกจากนี้ยังสามารถใช้ค่าจำนวนเต็มลบได้$priorityดังนั้นการโทรกลับติดสถานะที่มีลำดับความสำคัญ0ไม่จำเป็นต้องอยู่ด้านบนสุดของลำดับการดำเนินการ
Dave Romsey

0

ไม่ จำกัด และไม่มีการปรับโทษ จากการตรวจสอบรหัสคุณสามารถใช้สตริงเป็นลำดับความสำคัญแม้ว่าฉันจะไม่แนะนำให้ทำเช่นนั้น)

หากการกระทำของคุณต้องเป็นครั้งสุดท้ายคุณสามารถตรวจสอบกฎที่ได้รับมอบหมายโดยดูที่ดัชนีของโลก$wp_actions[your hook]เมื่อการกระทำของคุณถูกเรียกและเพิ่มอีกครั้งด้วยลำดับความสำคัญที่สูงขึ้นหากจำเป็น แต่ฉันไม่เห็นเหตุผลที่ทำแบบนี้จริง ๆ ของสิ่งที่.


0

ไม่มี "จำกัด " จริง ๆ เนื่องจากมีการจัดเก็บ hooks ไว้เป็นอาร์เรย์จริงและลำดับความสำคัญคือดัชนีตัวเลข

แต่ในความเป็นจริงขนาดอาร์เรย์จะถูก จำกัด ด้วยจำนวนหน่วยความจำที่จัดสรรสำหรับการดำเนินการของสคริปต์

ดังนั้นฉันคิดว่าการตั้งค่าหมายเลขลำดับความสำคัญที่ยิ่งใหญ่น่าขันซึ่งเพิ่งแปลไปเป็นดัชนีตัวเลขในอาเรย์ที่จัดเก็บฟังก์ชั่นติดยาเสพติด - ไม่ควรชนเวิร์ดเพรส

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