Làm thế nào để tôi có được tên hàm bên trong một hàm trong PHP?


235

Có thể không?

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

1
Chỉ vì tò mò, khi nào cần điều này? Có thể tạo các chức năng mà bạn không biết tên của?
Không hài lòngGoat

37
Một cách sử dụng có thể là ghi nhật ký thực hiện của bạn. Nếu bạn đang viết "Tôi có lỗi trong". CHỨC NĂNG cho một logfile hoặc một cái gì đó. Bằng cách này, nếu tên hàm bị thay đổi, bạn không phải lo lắng về việc người đó nhớ thay đổi thông điệp tường trình.
Brian Ramsay

1
Cần điều này để đăng nhập! cảm ơn vì đã hỏi :)
SublymeRick

2
Cũng hữu ích nếu bạn muốn sử dụng tên hàm bên trong hàm (cho mục đích sử dụng khác). Giống như xây dựng các liên kết dựa trên hàm, v.v. (ví dụ: function name1()sau đó sử dụng lại tên1 bên trong), sẽ tiết kiệm rất nhiều thời gian nếu bạn có cùng một khuôn mẫu cho nhiều chức năng.
Mafia

1
@DisgruntledGoat: sẽ hữu ích nếu bạn tạo các chức năng theo cách thủ công và không muốn chỉnh sửa thông báo lỗi cho mọi chức năng. Thêm nó vào thông báo lỗi có nghĩa là bạn có ít công việc hơn.
John Boe

Câu trả lời:


390

Cách chính xác là sử dụng __FUNCTION__ hằng số ma thuật được xác định trước .

Thí dụ:

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

Kết quả : MethodA.


6
FUNCTION hoạt động cho các chức năng không phải là lớp. Đã thử trên PHP 7.0.8.
mvsagar

Cùng một cách, làm thế nào để có được tên lớp?
Kiran Reddy

2
@KiranReddy Cũng có một hằng số kỳ diệu cho điều đó : __CLASS__. Hoặc bạn có thể làm get_class($this).
Sean the Bean

1
Đã thử trên PHP> = 4
Nabi KAZ

98

Bạn có thể sử dụng các hằng số ma thuật __METHOD__ (bao gồm tên lớp) hoặc __FUNCTION__(chỉ tên hàm) tùy thuộc vào việc đó là phương thức hay hàm ... =)


42
PHƯƠNG PHÁP bao gồm tên lớp, CHỨC NĂNG chỉ có vậy. Cái sau có sẵn như nhau trong phương thức của một lớp.
Alister Bulman

3
Đúng. Nhưng nó thường hữu ích khi lấy MyClass :: methodName thay vì methodName.
PatrikAkerstrand

16

Nếu bạn đang sử dụng PHP 5, bạn có thể thử điều này:

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

14
Đây là tài nguyên chuyên sâu đáng kinh ngạc. Sử dụng FUNCTION hoặc PHƯƠNG PHÁP hiệu quả hơn nhiều. debug_backtrace () là tuyệt vời nếu bạn cần nhiều hơn chỉ là tên hàm.
Luke Cousins

2
Đó là một cách thực hành tồi để sử dụng debug_backtrace () cho mục đích này
Marcio Mazzucato

1
ĐÂY LÀ CÁCH ĐÚNG duy nhất tôi đã tìm thấy !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! bởi vì __FUNCTION__trả về tên hàm cha (khi hàm hiện tại được bao gồm trong hàm cha)
T.Todua

5
@tazo todua. bạn có thể đưa ra một ví dụ không?
alds

2
<?php

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

Kết quả: "Phương phápA";


Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
SilverNak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.