php is_function () เพื่อตรวจสอบว่าตัวแปรเป็นฟังก์ชันหรือไม่


89

ผมรู้สึกตื่นเต้นสวยที่จะอ่านเกี่ยวกับฟังก์ชั่นที่ไม่ระบุชื่อใน PHP ซึ่งช่วยให้คุณสามารถประกาศตัวแปรที่มีฟังก์ชั่นง่ายกว่าที่คุณจะทำอย่างไรกับcreate_function ตอนนี้ฉันสงสัยว่าฉันมีฟังก์ชันที่ส่งผ่านตัวแปรฉันจะตรวจสอบได้อย่างไรว่าเป็นฟังก์ชันหรือไม่ ยังไม่มีฟังก์ชัน is_function () และเมื่อฉันทำ var_dump ของตัวแปรที่เป็นฟังก์ชัน ::

$func = function(){
    echo 'asdf';
};
var_dump($func);

ฉันได้รับสิ่งนี้:

object(Closure)#8 (0) { } 

มีความคิดเกี่ยวกับวิธีตรวจสอบว่าเป็นฟังก์ชันหรือไม่?

คำตอบ:


142

ใช้is_callableเพื่อกำหนดว่าตัวแปรที่กำหนดเป็นฟังก์ชันหรือไม่ ตัวอย่างเช่น:

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

10
is_callable () จะทำงานได้ดีไม่ว่าคุณจะส่งผ่านฟังก์ชันที่ไม่ระบุตัวตนชื่อฟังก์ชันเป็นสตริงหรืออาร์เรย์เรียกกลับ PHP ที่ถูกต้อง หากคุณต้องการตรวจสอบฟังก์ชันที่ไม่ระบุตัวตนโดยเฉพาะคุณก็ต้องการบางอย่างเช่นที่ Gumbo พูด: ตรวจสอบให้แน่ใจว่าพารามิเตอร์เป็นวัตถุและตรวจสอบให้แน่ใจว่าเป็นอินสแตนซ์ของการปิด
เลน

2
จะเกิดอะไรขึ้นถ้าฉันต้องการตรวจสอบว่ามันเป็นสายรัดหรือสายอักขระและทำสิ่งต่าง ๆ สำหรับพวกเขา ฉันไม่ต้องการให้ค่าสตริงถูกเรียกกลับโดยไม่ได้ตั้งใจ
Gherman

3
@ เยอรมันเพียงตรวจสอบก่อนว่า is_string ($ func) จากนั้นตรวจสอบครั้งที่สองด้วย is_callable ($ func)
Heroselohim

4
ข้อมูลโค้ดด้านบนทำให้ฉันมีปัญหา ฉันตั้งใจให้สตริงที่มีข้อความว่า "Date" จากนั้นจะถูกจัดการเป็นการปิดและดำเนินการ วิธีที่ถูกต้องคือ if (($ variable instanceof Closure) && is_callable ($ variable)) {... }
Basil Musa

1
ทำไมอินสแตนซ์ของการปิดและสามารถเรียกใช้ได้ การปิดไม่สามารถเรียกใช้ได้เมื่อใด คงไม่แปลกใจถ้ามีเวลา แต่ฉันสงสัยว่าทำไมเราถึงต้องเช็คทั้งสองอย่าง
Joel M

34

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

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

ขอบคุณสำหรับสิ่งนี้! แอปของฉันอนุญาตให้ผู้ใช้ระบุฟังก์ชันการแฮชของตนเองหรือระบุอาร์กิวเมนต์สำหรับแฮช () แต่อัลกอริธึมการแฮชที่ถูกต้องบางส่วนยังเป็น PHP ในตัวดังนั้นจึงสามารถเรียกใช้ได้ (เช่น 'md5', 'sha1') is_object()และinstanceof Closureเป็นวิธีที่มีประสิทธิภาพมากขึ้นในการตรวจสอบสิ่งนี้!
njbair

ลบการเรียก is_string และ function_exists และนี่คือฟังก์ชันที่คุณต้องการใช้เพื่อตรวจหาฟังก์ชันแลมบ์ดา ขอขอบคุณ!
แจ็ค

30

ถ้าคุณเพียงต้องการที่จะตรวจสอบว่าตัวแปรที่เป็นฟังก์ชั่นที่ไม่ระบุชื่อและไม่สตริง callable instanceofหรืออาเรย์ใช้

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

ฟังก์ชันที่ไม่ระบุชื่อ (ประเภทที่เพิ่มใน PHP 5.3) เป็นอินสแตนซ์ของClosureคลาสเสมอและทุกอินสแตนซ์ของClosureคลาสเป็นฟังก์ชันที่ไม่ระบุชื่อ

มีอีกประเภทหนึ่งใน PHP ที่สามารถพิจารณาได้ว่าเป็นฟังก์ชันและนั่นคือวัตถุที่ใช้__invokeวิธีมายากล หากคุณต้องการที่จะรวมเหล่านั้น (ในขณะที่ยังไม่รวมสตริงและอาร์เรย์) method_exists($func, '__invoke')การใช้งาน ซึ่งจะยังคงรวมถึงการปิดเนื่องจากการปิดใช้งาน__invokeเพื่อความสม่ำเสมอ


8
สิ่งนี้มีประโยชน์อย่างยิ่งเนื่องจากis_callable()จะพยายามค้นหาวิธีการเรียกตามสตริงหรืออาร์เรย์ที่ส่งผ่านซึ่งอาจโหลดคลาสอัตโนมัติและอาจไม่ใช่พฤติกรรมที่คุณคาดหวัง / ต้องการ
spikyjt

2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}

ในอนาคต PHP อาจเปลี่ยน gettype () จาก Object เป็น Callable เหมือนที่ภาษาอื่นทำอยู่แล้ว ดังนั้นคำตอบนี้น่าจะเป็นวิธีที่ดีที่สุด แต่สามารถปรับให้เหมาะสมเป็น: return! is_string ($ f) &&! is_array ($ f) && is_callable ($ f)
Alexandre T.

0

ในคำเรียกที่ถูกต้องของ php สามารถเป็นฟังก์ชันชื่อของฟังก์ชัน (สตริง) และอาร์เรย์ของรูปแบบ['className', 'staticMethod']หรือ[$object, 'method']ดังนั้นในการตรวจจับเฉพาะฟังก์ชันจำเป็นต้องแยกสตริงและอาร์เรย์:

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.