পিএইচপি-তে কলার ফাংশনের নাম পান?


135

কোনও প্রদত্ত ফাংশনে কলার ফাংশনের নাম জানতে কোনও পিএইচপি ফাংশন রয়েছে?


আপনার Xdebug ব্যবহার করা উচিত। : এই পোস্টে আমার উত্তর দেখুন stackoverflow.com/questions/1513069/...
svassr

13
এক্সডিবাগ স্পষ্টভাবে কেবল একটি পিএইচপি ফাংশন নয়, যা মূল অনুরোধ ছিল। যদি আপনি উদাহরণস্বরূপ পরবর্তী পিএইচপি যুক্তিতে কলার ফাংশনটির নামটি ব্যবহার করতে এবং প্রোডাকশন সার্ভারগুলিতে এক্সডিবুগ ইনস্টল না করতে চান তবে আপনার একটি পিএইচপি ফাংশন প্রয়োজন।
জেপি

উত্তর:


198

ডিবাগ_ব্যাকট্রেস দেখুন - এটি আপনার কল স্ট্যাকটিকে শীর্ষে সন্ধান করতে পারে।

আপনি কীভাবে আপনার কলার পেতে পারেন তা এখানে:

$trace = debug_backtrace();
$caller = $trace[1];

echo "Called by {$caller['function']}";
if (isset($caller['class']))
    echo " in {$caller['class']}";

59
আমার কাছে মনে হচ্ছে এটি কলি ফাংশনটির নাম মুদ্রণ করে। পারফরম্যান্সের জন্য list(, $caller) = debug_backtrace(false);কলার পেতে ব্যবহার করুন false;-) (php5.3)
Znarkus

ওয়েবে দেখা অনেকগুলি সমাধান ইনকাস্টার কলার পেতে ব্যাকট্রেস অ্যারের দ্বিতীয় উপাদানটি পেয়ে থাকে: আমরা কি এটি সম্পর্কে এতটা নিশ্চিত হতে পারি? দ্বিতীয় উপাদানটি কি সর্বদা আমরা অনুসন্ধান করছি? আমি ভেবেছিলাম একটি __ কনস্ট্রাক্ট () যার মধ্যে অন্য কলের মধ্যে যেমন পিতামাতার :: __ কনস্ট্রাক্ট () অন্য অবস্থানে স্থানান্তর করতে পারে আসল কলার (এখনও চেষ্টা করা হয়নি)।
ইমানুয়েল দেল গ্র্যান্ড

1
আমি রিফ্লেকশন ক্লাস ব্যবহার করার সময় কলকারীদের ফিরে আসার ক্রমটি যাচাই করার চেষ্টা করেছি এবং এটি স্পষ্টতই "বাস্তব" কলার পদ্ধতির অবস্থান পরিবর্তন করে যা ইউজার ইন্টারফেসে দৃশ্যমান, সুতরাং ব্যাকট্র্যাসের অবস্থান সম্পর্কে কোনও অনুমান করা যায় না।
ইমানুয়েল দেল গ্র্যান্ড

4
অ্যারে শিফট প্রথম উপাদানটি সরিয়ে ফেলবে এবং সরানো উপাদানটি ফিরিয়ে দেবে। আসল অ্যারেটি সংশোধন করা হবে এবং এটি প্রয়োজনীয় ফলাফল দেওয়া উচিতecho 'called by '.$trace[0]['function']
গুডস্পিপি

21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];ভাল পারফরম্যান্স সহ কলার নাম পেতে।
ahuigo

17

এক্সডিবাগ কিছু দুর্দান্ত ফাংশন সরবরাহ করে।

<?php
  Class MyClass
  {
    function __construct(){
        $this->callee();
    }
    function callee() {
        echo sprintf("callee() called @ %s: %s from %s::%s",
            xdebug_call_file(),
            xdebug_call_line(),
            xdebug_call_class(),
            xdebug_call_function()
        );
    }
  }
  $rollDebug = new MyClass();
?>

ট্রেস ফিরে আসবে

callee() called @ /var/www/xd.php: 16 from MyClass::__construct

উবুন্টুতে এক্সডিবুগ ইনস্টল করার জন্য সবচেয়ে ভাল উপায়

sudo aptitude install php5-xdebug

আপনাকে প্রথমে php5-dev ইনস্টল করতে হবে

sudo aptitude install php5-dev

অধিক তথ্য


15

এটি খুব দেরী হয়েছে তবে আমি ফাংশনটি ভাগ করতে চাই যা ফাংশনটির নাম দেয় যা থেকে বর্তমান ফাংশনটি বলা হয়।

public function getCallingFunctionName($completeTrace=false)
    {
        $trace=debug_backtrace();
        if($completeTrace)
        {
            $str = '';
            foreach($trace as $caller)
            {
                $str .= " -- Called by {$caller['function']}";
                if (isset($caller['class']))
                    $str .= " From Class {$caller['class']}";
            }
        }
        else
        {
            $caller=$trace[2];
            $str = "Called by {$caller['function']}";
            if (isset($caller['class']))
                $str .= " From Class {$caller['class']}";
        }
        return $str;
    }

আমি আশা করি এটি কার্যকর হবে।


1
আপনি সর্বাধিক স্বাগত ডেভিড !!! আমি এটি আমার প্রকল্পে ডিবাগিংয়ের উদ্দেশ্যেও ব্যবহার করছি :)
মনীশ জোপ

"সম্পূর্ণ ট্রেস" মোডটি খুব দরকারী। ভাগ করে নেওয়ার জন্য ধন্যবাদ.
লিওপোলোডো সান্জিক

15

debug_backtrace() বর্তমান কল স্ট্যাকের প্যারামিটারগুলি, ফাংশন / পদ্ধতি কলগুলির বিশদ সরবরাহ করে।


9
echo debug_backtrace()[1]['function'];

পিএইচপি 5.4 থেকে কাজ করে ।

বা অনুকূলিতকরণ (উদাহরণস্বরূপ নন-ডিবাগ ব্যবহারের ক্ষেত্রে):

echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];

প্রথম যুক্তি অব্যবহৃত ফাংশন আর্গুমেন্টগুলি তৈরি করতে বাধা দেয়, দ্বিতীয়টি ট্রেসকে দুটি স্তরে সীমাবদ্ধ করে (আমাদের দ্বিতীয়টি প্রয়োজন) need


7

এটি তৈরি এবং নিজেই এটি ব্যবহার করে

/**
 * Gets the caller of the function where this function is called from
 * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
 */
function getCaller($what = NULL)
{
    $trace = debug_backtrace();
    $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function

    if(isset($what))
    {
        return $previousCall[$what];
    }
    else
    {
        return $previousCall;
    }   
}

3

আমি কেবল এটিই বলতে চেয়েছিলাম যে ফ্লোরির পদ্ধতি কোনও ফাংশন হিসাবে কাজ করবে না কারণ এটি সর্বদা কলারের পরিবর্তে ডাকা ফাংশনটির নামটি ফিরিয়ে দেবে, তবে মন্তব্য করার জন্য আমার সুনাম নেই। আমি ফ্লোরির উত্তরের উপর ভিত্তি করে একটি খুব সাধারণ ফাংশন করেছি যা আমার মামলার জন্য দুর্দান্ত কাজ করে:

class basicFunctions{

    public function getCallerFunction(){
        return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
    }

}

উদাহরণ:

function a($authorisedFunctionsList = array("b")){
    $ref = new basicFunctions;
    $caller = $ref->getCallerFunction();

    if(in_array($caller,$authorisedFunctionsList)):
        echo "Welcome!";
        return true;
    else:
        echo "Unauthorised caller!";
        return false; 
    endif;
}

function b(){
    $executionContinues = $this->a();
    $executionContinues or exit;

    //Do something else..
}




1

এই কাজ করা উচিত:

$caller = next(debug_backtrace())['function'];

0

এটি দুর্দান্তভাবে এটি করবে:


// Outputs an easy to read call trace
// Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238
// Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b

Class MyClass{

public function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();
   
    for ($i = 0; $i < $length; $i++)
    {
        $result[] = ($i + 1)  . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }
   
    return "\t" . implode("\n\t", $result);
}

}

// call function where needed to output call trace

/**
Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
**/```
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.