ทำไมต้องใช้ถ้า function_exists


30

ฉันสังเกตุเห็นว่านักพัฒนาธีม WordPress จำนวนมากจะใช้สิ่งนี้ในfunctions.php

if (function_exists('register_nav_menus')) {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

สำหรับฉันฉันมักจะใช้ add_action สำหรับทุกฟังก์ชั่นที่ฉันใช้ในfunctions.php

ดังนั้นข้างต้นจะเขียนเป็น:

add_action('init', 'my_register_nav_menus');

function my_register_nav_menus() {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

ฉันมีสองคำถาม:

  1. เหตุใดจึงต้องใช้คำสั่ง if ในวิธีแรก

  2. วิธีใดที่ถูกต้อง

คำตอบ:


35

การตรวจสอบเพื่อดูว่ามีฟังก์ชั่นบิวท์อิน WordPress อยู่แล้วก่อนที่จะเรียกมันว่าเป็นความเข้ากันได้แบบย้อนกลับซึ่ง IMHO ไม่จำเป็น

ดังนั้นหากคุณเห็นif ( function_exists( 'register_nav_menus' ) )ผู้แต่งธีมรองรับเวอร์ชันก่อนหน้า 3.0

บางครั้งคุณยังเห็นว่าif ( function_exists( 'dynamic_sidebar' ) )ทำไม ฉันไม่สามารถบอกคุณได้เพราะ dynamic_sidebar ถูกนำมาใช้ใน 2.2

อีกเหตุผลที่ใช้คือทำให้ธีมหรือปลั๊กอินของคุณสามารถเสียบได้ ฟังก์ชันที่เสียบได้คือฟังก์ชันที่สามารถแทนที่ได้ในธีมลูกหรือปลั๊กอินอื่น

สิ่งนี้ทำตามคำจำกัดความไม่ใช่การโทรและคุณใช้! โอเปอเรเตอร์เพื่อตรวจสอบว่าไม่มีอยู่ก่อนที่คุณจะกำหนด

if ( ! function_exists( 'my_awesome_function' ) ) {
/**
 * My Awesome function is awesome
 *
 * @param array $args
 * @return array
 */
function my_awesome_function( $args ) {
  //function stuff
  return array();
  }
}

เมื่อดำเนินการเสร็จแล้วธีมลูกหรือปลั๊กอินอื่น ๆ สามารถแทนที่ฟังก์ชั่นนั้นได้ด้วยตัวของมันเอง


9

function_existsฟังก์ชั่นไม่ได้เป็นวิธีการอื่น ๆ ในการโหลดฟังก์ชั่นเช่นadd_actionสำหรับการตรวจสอบรหัสของคุณจะเห็นว่าไม่มีฟังก์ชั่นอื่น ๆ ที่มีชื่อเดียวกันกับที่ดังนั้นมันจะไม่ทำลายรหัสของคุณ จาก php.net:

ตรวจสอบรายการของฟังก์ชั่นที่กำหนดไว้ทั้งในตัว (ภายใน) และผู้ใช้กำหนดสำหรับ function_name

หากคุณมีฟังก์ชั่นเดียวกันสองครั้งในรหัสของคุณมันจะแตกนั่นคือสาเหตุที่คุณนำหน้าฟังก์ชั่นของคุณด้วยสิ่งอื่นที่ไม่ใช่ wp_

อ่านเพิ่มเติม: http://php.net/manual/en/function.function-exists.php


0

คุณสามารถใช้http://php.net/function_exists

if(function_exists('my_function')){
   // my_function is defined
}

หรือถ้าคุณต้องการที่จะเห็นฟังก์ชั่นทั้งหมดที่มีอยู่ดังนั้นคุณจึงพิมพ์ทั้งหมด

echo "<pre>"; print_r(get_defined_functions());

พิมพ์บนหน้าและคุณสามารถค้นหาฟังก์ชั่นนั้นหากไม่พบในรายการหมายความว่าไม่สามารถใช้งานได้

คุณอาจต้องเปิดใช้งานส่วนขยายสำหรับห้องสมุดเฉพาะ


0

php.net นิยามสิ่งนี้ว่า

(PHP 4, PHP 5, PHP 7) function_exists - ส่งคืน TRUE หากมีการกำหนดฟังก์ชันที่กำหนด

ฉันต้องเห็นด้วยกับมิเชลในการใช้งานที่คุณ [sh] จะต้องใช้การตรวจสอบสิ่งที่คล้ายกับการตรวจสอบการพิมพ์แบบหล่อ; ดังนั้นคุณจะมองหาฟังก์ชั่นที่มีอยู่ (ในหน้านั้นหรือจากสิ่งที่เรียกว่าการอ้างอิงหน้า / ไฟล์) ดังนั้นคุณจะรู้ว่าปลอดภัยที่จะเรียกใช้ฟังก์ชั่นอื่นหรือแยก HTML เทมเพลตบางส่วน

ดังที่มีคนกล่าวถึงมันถูกใช้โดยทั่วไปเพื่อตรวจสอบว่าไฟล์ / ธีมของคุณ (โดยใช้ WordPress) สามารถเรียกใช้คำขอที่คุณต้องการได้หรือไม่ ฉันใช้มันเพื่อตรวจสอบว่าธีมมีส่วนเทมเพลตเฉพาะหรือไม่

if ( function_exists( 'register_sidebar' ) ) { get_sidebar(); }


0

function_exists ควรใช้หลังชื่อฟังก์ชันในชุดรูปแบบที่ไม่เคยมีมาก่อน

add_action( 'loop_start', 'add_slider' );

function add_slider() {

if ( function_exists( 'soliloquy' ) ) { 

soliloquy( 'slider', 'slug' ); 

    }

}

การตรวจสอบนี้จะตรวจสอบให้แน่ใจว่าปลั๊กอินใช้งานอยู่ก่อนที่จะส่งออกฟังก์ชั่นและ / หรือมาร์กอัปมิฉะนั้นคุณอาจได้รับข้อผิดพลาดเช่นการเรียกไปยังฟังก์ชั่นที่ไม่ได้กำหนด

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