จะทราบได้อย่างไรว่าฟังก์ชันถูกกำหนดไว้ที่ไหน?


110

ฉันจะทราบได้อย่างไรว่าไฟล์และบรรทัดใดที่ฟังก์ชันกำหนดถูกกำหนดไว้

คำตอบ:


232

คุณสามารถทำได้ใน PHP เอง:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

8
เคล็ดลับ: $reflFunc->isInternal() === TRUEหมายถึง -> getFileName () และ -> getStartLine () จะส่งคืน FALSE
Bob Stein

สิ่งนี้ยังใช้ได้ดีสำหรับฉัน ฉันต้องการกำหนดเป้าหมายว่าฟังก์ชันจะเริ่มทำงานจากที่ใดแทนที่จะกำหนดจากที่ที่ฟังก์ชันนี้ถูกกำหนดไว้
EHerman

2
@EHerman ฉันไม่คิดว่าคุณจะพบผู้โทรของฟังก์ชันที่มีการสะท้อนกลับ ถ้าคุณทำได้มันอาจจะไม่ได้ผลสำหรับสิ่งนี้เนื่องจากไฟล์ PHP มักจะถูกรวมไว้ตามความต้องการดังนั้นคุณอาจไม่มีโค้ดทั้งหมดที่โหลดซึ่งเรียกใช้ฟังก์ชันนี้
Tom Haigh

11
สำหรับวิธีการคลาสคุณสามารถใช้ได้$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay

3
@EHerman คุณสามารถดู debug_backtrace () เพื่อค้นหาตำแหน่งที่เรียกใช้ฟังก์ชัน
dotVezz

12

ใช้ IDE ที่อนุญาตให้ทำเช่นนั้น (ฉันขอแนะนำ Eclipse PDT) หรือคุณสามารถ grep ทั้งหมดได้หากใช้บน Linux หรือใช้ wingrep ใน Linux มันจะเป็นดังนี้:

grep -R "function funName" *

จากภายในโฟลเดอร์รากของโครงการ


5
ดีกว่าที่จะมี: grep -R "function \ sfunName" *
David

3

หากคุณใช้ IDE เช่น Netbeans คุณสามารถ CTRL + คลิกฟังก์ชันที่ใช้และจะนำคุณไปยังตำแหน่งที่กำหนดโดยสมมติว่าไฟล์อยู่ในโฟลเดอร์โครงการที่คุณกำหนด

ไม่มีรหัสหรือฟังก์ชันที่จะทำสิ่งนี้


เหมือนกันใน Zend Studio และฉันคิดว่าสิ่งนี้จะทำงานกับ PDT สำหรับ Eclipse ได้เช่นกัน
Gordon

@Gordon "an IDE like" ฉันคิดว่านี่เป็นสิ่งที่ต้องมีสำหรับIDE สมัยใหม่ใด ๆ ...
feeela

2

ฉันคิดว่าตามที่ "อธิบาย" คุณหมายถึง "กำหนด" สำหรับสิ่งนี้คุณจำเป็นต้องมี IDE ที่ดีที่สามารถทำได้


ฉันใช้ Aptana ซึ่งมีการค้นหาข้อความผ่านโครงการ แต่ในการใช้งานฉันจำเป็นต้องนำเข้าไซต์หลุม (ใหญ่มาก) เป็นโครงการ
SaltLake

2

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

<?php 
$find="somefunction()";

echo findString('./ProjectFolderOrPath/',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){
                        $filesource=file_get_contents($path.'/'.$file);
                        $pos = strpos($filesource, $find);
                        if ($pos === false) {
                            continue;
                        } else {
                            echo "The string '$find' was found in the file '$path/$file and exists at position $pos<br />";
                        }
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>

2

อีกวิธีหนึ่งในการตรวจสอบว่าฟังก์ชันกำหนดไว้ที่ใดพยายามกำหนดฟังก์ชันใหม่ระบบข้อผิดพลาด PHP จะส่งคืนข้อผิดพลาดที่บอกคุณว่าฟังก์ชันกำหนดไว้ก่อนหน้านี้


1

ฉันชอบวิธีแก้ปัญหาของ Tom ดังนั้นฉันคิดว่าฉันสามารถแบ่งปันเคล็ดลับอีกเล็กน้อยกับReflectionFunction (ควรใช้ได้กับทุก PHP 5):

  • ซับเดียวเพื่อพิมพ์ชื่อไฟล์:

    print (new ReflectionFunction("foo"))->getFileName();

โปรดทราบว่าจะไม่แสดงตำแหน่งของฟังก์ชันภายใน (เช่น_ ) แต่ยังคงสามารถพิมพ์ API ได้ดังต่อไปนี้

  • เพื่อพิมพ์คำจำกัดความและพารามิเตอร์ของฟังก์ชัน:

    print new ReflectionFunction("foo");

    ตัวอย่าง:

    $ php -r 'print new ReflectionFunction("_");'
    Function [ <internal:gettext> function _ ] {
      - Parameters [1] {
        Parameter #0 [ <required> $msgid ]
      }
    }

0

คุณจะต้องมี IDE ที่รองรับฟังก์ชัน "Open Function Declaration" สิ่งที่ดีสำหรับ php คือ Eclipse PDT

หากต้องการค้นหานิยามของฟังก์ชันให้เน้นชื่อฟังก์ชันกด CTRL + คลิกที่ชื่อ

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