ฉันจะรับชื่อฟังก์ชั่นภายในฟังก์ชั่นใน PHP ได้อย่างไร?


235

เป็นไปได้ไหม?

function test()
{
  echo "function name is test";
}

1
เพิ่งออกมาจากความอยากรู้อยากรู้อยากเห็นเมื่อไหร่? เป็นไปได้ไหมที่จะสร้างฟังก์ชั่นที่คุณไม่รู้ชื่อ
DisgruntledGoat

37
หนึ่งในการใช้ที่เป็นไปได้คือการบันทึกการทำงานของคุณ หากคุณเขียนว่า "ฉันมีข้อผิดพลาด" ทำหน้าที่เป็นไฟล์บันทึกหรือบางสิ่งบางอย่าง ด้วยวิธีนี้หากชื่อฟังก์ชั่นเปลี่ยนไปคุณไม่ต้องกังวลกับคนที่จำได้ว่าต้องเปลี่ยนข้อความบันทึก
Brian Ramsay

1
ต้องการสิ่งนี้สำหรับการบันทึก! ขอบคุณที่ถาม :)
SublymeRick

2
มีประโยชน์ถ้าคุณต้องการใช้ชื่อฟังก์ชั่นภายในฟังก์ชั่น (สำหรับการใช้งานอื่น) ชอบสร้างลิงก์ตามฟังก์ชั่น ฯลฯ (เช่นfunction name1()จากนั้นใช้name1อีกครั้งภายใน) จะช่วยประหยัดเวลาได้มากถ้าคุณมีเทมเพลตเดียวกันสำหรับฟังก์ชั่นมากมาย
มาเฟีย

1
@DisgruntledGoat: มีประโยชน์หากคุณสร้างฟังก์ชั่นด้วยตนเองและไม่ต้องการแก้ไขข้อความแสดงข้อผิดพลาดสำหรับทุกฟังก์ชั่น การเพิ่มลงในข้อความแสดงข้อผิดพลาดหมายความว่าคุณมีงานน้อยลง
John Boe

คำตอบ:


390

วิธีที่ถูกต้องคือการใช้อย่างต่อเนื่องมายากลที่กำหนดไว้ล่วงหน้า__FUNCTION__

ตัวอย่าง:

class Test {
    function MethodA(){
        echo __FUNCTION__;
    }
}

MethodAส่งผลให้เกิด:


6
ฟังก์ชั่นใช้งานได้สำหรับฟังก์ชั่นที่ไม่ใช่ชั้นเรียนเช่นกัน พยายามใน PHP 7.0.8
mvsagar

เช่นเดียวกับวิธีรับชื่อคลาส?
Kiran Reddy

2
@KiranReddy __CLASS__มีค่าคงที่วิเศษสำหรับที่มากเกินไปเป็น: get_class($this)หรือที่คุณสามารถทำได้
Sean the Bean

1
พยายามใน PHP> = 4
Nabi KAZ

98

คุณสามารถใช้ค่าคงที่เวทย์มนตร์ __METHOD__ (รวมถึงชื่อคลาส) หรือ__FUNCTION__(เพียงชื่อฟังก์ชั่น) ขึ้นอยู่กับว่ามันเป็นวิธีการหรือฟังก์ชั่น ... =)


42
วิธีการรวมถึงชื่อชั้นฟังก์ชั่นเป็นเพียงแค่นั้น หลังมีเท่า ๆ กันในวิธีการเรียน
Alister Bulman

3
นั่นเป็นเรื่องจริง แต่มักจะมีประโยชน์ในการรับ MyClass :: methodName แทน methodName
PatrikAkerstrand

16

หากคุณใช้ PHP 5 คุณสามารถลอง:

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}

14
นี่คือทรัพยากรที่เหลือเชื่ออย่างไม่น่าเชื่อ การใช้ฟังก์ชั่นหรือวิธีการมีประสิทธิภาพมากขึ้น debug_backtrace () ยอดเยี่ยมถ้าคุณต้องการมากกว่าแค่ชื่อฟังก์ชั่น
ลุคลูกพี่ลูกน้อง

2
มันเป็นวิธีปฏิบัติที่ไม่ดีที่จะใช้ debug_backtrace () เพื่อจุดประสงค์นี้
Marcio Mazzucato

1
นี่เป็นวิธีที่ถูกต้องเท่านั้นที่ฉันได้พบ !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! เพราะ__FUNCTION__คืนค่าชื่อฟังก์ชันพาเรนต์ (เมื่อฟังก์ชันปัจจุบันรวมอยู่ในฟังก์ชันพาเรนต์)
T.Todua

5
@tazo todua คุณยกตัวอย่างได้ไหม
ราคา

2
<?php

  class Test {
     function MethodA(){
         echo __FUNCTION__ ;
     }
 }
 $test = new Test;
 echo $test->MethodA();
?>

ผลลัพธ์: "MethodA";


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