কোনও প্রদত্ত ফাংশনে কলার ফাংশনের নাম জানতে কোনও পিএইচপি ফাংশন রয়েছে?
কোনও প্রদত্ত ফাংশনে কলার ফাংশনের নাম জানতে কোনও পিএইচপি ফাংশন রয়েছে?
উত্তর:
ডিবাগ_ব্যাকট্রেস দেখুন - এটি আপনার কল স্ট্যাকটিকে শীর্ষে সন্ধান করতে পারে।
আপনি কীভাবে আপনার কলার পেতে পারেন তা এখানে:
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";
if (isset($caller['class']))
echo " in {$caller['class']}";
list(, $caller) = debug_backtrace(false);কলার পেতে ব্যবহার করুন false;-) (php5.3)
echo 'called by '.$trace[0]['function']
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];ভাল পারফরম্যান্স সহ কলার নাম পেতে।
এক্সডিবাগ কিছু দুর্দান্ত ফাংশন সরবরাহ করে।
<?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
এটি খুব দেরী হয়েছে তবে আমি ফাংশনটি ভাগ করতে চাই যা ফাংশনটির নাম দেয় যা থেকে বর্তমান ফাংশনটি বলা হয়।
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;
}
আমি আশা করি এটি কার্যকর হবে।
debug_backtrace() বর্তমান কল স্ট্যাকের প্যারামিটারগুলি, ফাংশন / পদ্ধতি কলগুলির বিশদ সরবরাহ করে।
echo debug_backtrace()[1]['function'];
পিএইচপি 5.4 থেকে কাজ করে ।
বা অনুকূলিতকরণ (উদাহরণস্বরূপ নন-ডিবাগ ব্যবহারের ক্ষেত্রে):
echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
প্রথম যুক্তি অব্যবহৃত ফাংশন আর্গুমেন্টগুলি তৈরি করতে বাধা দেয়, দ্বিতীয়টি ট্রেসকে দুটি স্তরে সীমাবদ্ধ করে (আমাদের দ্বিতীয়টি প্রয়োজন) need
এটি তৈরি এবং নিজেই এটি ব্যবহার করে
/**
* 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;
}
}
আমি কেবল এটিই বলতে চেয়েছিলাম যে ফ্লোরির পদ্ধতি কোনও ফাংশন হিসাবে কাজ করবে না কারণ এটি সর্বদা কলারের পরিবর্তে ডাকা ফাংশনটির নামটি ফিরিয়ে দেবে, তবে মন্তব্য করার জন্য আমার সুনাম নেই। আমি ফ্লোরির উত্তরের উপর ভিত্তি করে একটি খুব সাধারণ ফাংশন করেছি যা আমার মামলার জন্য দুর্দান্ত কাজ করে:
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..
}
আপনি ডিবাগ_ব্যাকট্র্যাস দ্বারা ফিরে অ্যারে থেকে এই তথ্যটি বের করতে পারেন
এই আমার জন্য সবচেয়ে ভাল কাজ করেছে: var_dump(debug_backtrace());
আসলে আমি মনে করি ডিবাগ_প্রিন্ট_ব্যাকট্রেস () আপনার যা প্রয়োজন তা করে। http://php.net/manual/en/function.debug-print-backtrace.php
এটি দুর্দান্তভাবে এটি করবে:
// 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()
**/```