Php откуда вызван метод

Форум PHP программистов ► PHP практикум ► PHP для начинающих

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 17061
На форуме:
Карма:

Привет, как определить откуда вызывается определенный метод, что нить типа этого
[ php ]echo [ php ]

не совсем, просто по коду метод должен отрабатывать с одними парамерами, а вызывается с другими, надо понять откуда он еще может вызываться

Совсем ни чего не понял что ты хочешь и для чего тебе это надо.
Распиши в полном обеме свою проблему и наче ни ведать тебе ответа.

PHP
function show_gateways ( $transaction_id , $payment_amount , $currency , $user_id , $payment_description = null , $dp_gateways = null , $is_buy_out = false , $sql_select_wmon = null )

он вызывается с параметром $is_buy_out = true надо найти место откуда он вызывается с этим парметром, мест вызова очень много, в других языках можно сгенерить ошибку типа поменять название на _show_gateways и генерится ошибка с указанием места откуда он вызвается с указанием строчки. Здесь же просто барузер зависает и все

Цитата (miker @ 26.05.2009 — 11:18)
. в других языках можно сгенерить ошибку типа поменять название на _show_gateways и генерится ошибка с указанием места откуда он вызвается с указанием строчки.

А ежели просто поискать вызов этой функции, используя чисто возможности Винды (если не хочется использовать специальные программы)? Берешь проводник, включаешь поиск. И за пару секунд получаешь все файлы, где есть вызов этой функции. И дальше делаешь всё, что хочешь с этими файлами.
Меняешь названия функций, удаляешь их, удаляешь все скрипты целиком, чтобы они не мешали спокойно жить.

Читайте также:  Безопасно передать данные php

Или я что-то не понимаю в этой жизни.

Насколько я знаю, есть только одна возможность выследить средствами php откуда приходит в скрипт ненужная переменная (нужен php5 , иначе слушай sergeiss). Хотя, глядя на код функции, возникают сомнения, что у тебя php5 , однако.

В начале метода нужно вставить что-то в этом духе:

PHP
function show_gateways ( $transaction_id , $payment_amount , $currency , $user_id , $payment_description = null , $dp_gateways = null , $is_buy_out = false , $sql_select_wmon = null )
try
if ( $is_buy_out === false )
throw new Exception ( ‘передан неверный параметр в ‘ . __METHOD__ );
>
catch ( Exception $e )
echo ‘
' ;
echo $e -> getMessage () . "\n" ;
echo 'Стек вызовов:' . "\n" ;
print_r ( $e -> getTrace ());
echo '

‘ ;
>

В стеке вызовов будет видно откуда вызван метод. Только странно вообще то, когда на значение по умолчанию для параметра ставят некорректное значение. Обычно ставят то, что чаще всего встречается в программе. Если часто используется true, то проще заменить им текущее значение по умолчанию и не париться.

Источник

Как узнать имя метода, который вызвал метод?

Из примера думаю суть ясна, как узнать имя класса нашел, мне бы теперь узнать имя дочернего метода который вызвал метод родителя, можно конечно это имя передать параметром, но так не интересно же.

Оценить 8 комментариев

qonand

И где здесь ООП? Класс от которого наследуются ничего не должен знать о классах которые его наследуют, это вообще не ООП подход

sanek_os9

Максим Федоров: он у меня умный потому знает кто дергает его методы, почему бы нет? Наверное я книжки плохо читал

Александр Шаповал: Такой подход — 99.99% знак говнокода. Или даже 100%. Не должны методы знать такую информацию. В нормальной архитектуре это ни к чему.

sanek_os9

Евгений: в своём случае, в методе display я подключаю файл шаблона, что бы в дочернем методе не передавать имя файла который нужно подключить я беру это имя из его названия и подключаю. В итоге получаю что какой метод вызывает display такой файл и подключаю, как по мне вполне юзабельно.

Александр Шаповал: Гораздо понятнее, проще, быстрее и красивее определить у класса атрибут типа template_name .

sanek_os9

Евгений: ну это тогда придется его определять у каждого метода (если в нем предусмотрен вывод), и хорошо когда этот атрибут соответствует имени метода, что бы когда смотришь шаблон было видно какой файл в каком классе используется, поэтому встает вопрос зачем указывать то, что заранее известно. Что касается понимания, тут все просто, достаточно один раз понять что файл шаблона подключается исходя из имени метода и класса.
Раньше я писал

class posts extends Controller < public function actionIndex() < $this->display('posts/index'); > >
class posts extends Controller < public function actionIndex() < $this->display(); > >

Один раз в методе display написал «не красиво» зато потом все красиво и структура файлов у шаблона тоже красива, потому что иначе он не будет работать.

Александр Шаповал: Поверьте моему опыту. Ради экономии 7-10 символов, вы усложнили код для понимания и изменения. И это потом выльется в часы отладки у вас или следующего разработчика.

sanek_os9

Евгений: спасибо за совет. Тут суть не только в сокращении кода а и содержании в порядке файлов шаблона, ведь легко можно там развести бардак. Пока оставлю как есть, а в дальнейшем если что, понесу всю ответственность:)

Источник

get_called_class

Gets the name of the class the static method is called in.

Parameters

This function has no parameters.

Return Values

Errors/Exceptions

If get_called_class() is called from outside a class, an Error is thrown. Prior to PHP 8.0.0, an E_WARNING level error was raised.

Changelog

Version Description
8.0.0 Calling this function from outside a class, will now throw an Error . Previously, an E_WARNING was raised and the function returned false .

Examples

Example #1 Using get_called_class()

class foo static public function test () var_dump ( get_called_class ());
>
>

The above example will output:

See Also

  • get_parent_class() — Retrieves the parent class name for object or class
  • get_class() — Returns the name of the class of an object
  • is_subclass_of() — Checks if the object has this class as one of its parents or implements it

User Contributed Notes 9 notes

As of PHP 5.5 you can also use «static::class» to get the name of the called class.

class Bar public static function test () var_dump (static::class);
>
>

get_called_class() in closure-scopes:

ABSTRACT CLASS Base
protected static $stub = [ ‘baz’ ];

//final public function boot()
static public function boot ()
print __METHOD__ . ‘-> ‘ . get_called_class (). PHP_EOL ;

array_walk (static:: $stub , function()
print __METHOD__ . ‘-> ‘ . get_called_class (). PHP_EOL ;
>);
>

public function __construct ()
self :: boot ();
print __METHOD__ . ‘-> ‘ . get_called_class (). PHP_EOL ;

array_walk (static:: $stub , function()
print __METHOD__ . ‘-> ‘ . get_called_class (). PHP_EOL ;
>);
>
>

// static boot
Base :: boot (); print PHP_EOL ;
// Base::boot -> Base
// Base:: -> Base

Sub :: boot (); print PHP_EOL ;
// Base::boot -> Sub
// Base:: -> Base

new sub ;
// Base::boot -> Sub
// Base:: -> Base
// Base->__construct -> Sub
// Base-> -> Sub

// instance boot
new sub ;
// Base->boot -> Sub
// Base-> -> Sub
// Base->__construct -> Sub
// Base-> -> Sub
?>

I think it is worth mentioning on this page, that many uses of the value returned by get_called_function() could be handled with the new use of the old keyword static, as in
static:: $foo ;
?>

versus
$that = get_called_class ();
$that :: $foo ;
?>

I had been using $that:: as my conventional replacement for self:: until my googling landed me the url above. I have replaced all uses of $that with static with success both as
static:: $foo ; //and.
new static();
?>

Since static:: is listed with the limitation: «Another difference is that static:: can only refer to static properties.» one may still need to use a $that:: to call static functions; though I have not yet needed this semantic.

namespace root;
class Factor protected static $instance = null;

private function __construct()

public static function getInstance() if (!self::$instance) $name = get_called_class();
self::$instance = new $name();
>

class Single extends Factor public function abc() return ‘abc’;
>
>

class Index public function get() return Single::getInstance();
>
>

$index = new Index();
var_dump($index->get());

Источник

php: определить, откуда была вызвана функция

есть ли способ узнать, откуда была вызвана функция в PHP? пример:

function epic() < fail(); >function fail() < //at this point, how do i know, that epic() has called this function? > 

Вы можете использовать debug_backtrace() .

 function fail( $string ) < $backtrace = debug_backtrace(); print_r( $backtrace ); >epic( 'Hello', 'World' ); 
Array ( [0] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 5 [function] => fail [args] => Array ( [0] => Hello World ) ) [1] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 15 [function] => epic [args] => Array ( [0] => Hello [1] => World ) ) ) 

Так что, если вы все еще ДЕЙСТВИТЕЛЬНО не знаете, как это, а вот решение:

$backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!'; 

Самое быстрое и простое решение, которое я нашел

public function func() < //function whose call file you want to find $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); >$trace: Array ( [0] => Array ( [file] => C:\wamp\www\index.php [line] => 56 [function] => func [class] => (func Class namespace) [type] => -> ) ) 

Я тестирую скорость на ноутбуке Lenovo: процессор Intel Pentium N3530 2,16 ГГц, оперативная память 8 ГБ

global $times; $start = microtime(true); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $times[] = microtime(true) - $start; 
count($times): 97 min: 2.6941299438477E-5 max: 10.68115234375E-5 avg: 3.3095939872191E-5 median: 3.0517578125E-5 sum: 321.03061676025E-5 the same results with notation without E-5 count($times): 97 min: 0.000026941299438477 max: 0.0001068115234375 avg: 0.000033095939872191 median: 0.000030517578125 sum: 0.0032103061676025 

Попробуйте ввести код ниже.

foreach(debug_backtrace() as $t) < echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()
"; >
function findFunction($function, $inputDirectory="") < //version 0.1 $docRoot = getenv("DOCUMENT_ROOT"); $folderArray = null; $dirArray = null; // open directory $directory = opendir($docRoot.$inputDirectory); // get each entry while($entryName = readdir($directory)) < if(is_dir($entryName) && $entryName != "." && $entryName != "..")< $folderArray[] = str_replace($inputDirectory, "", $entryName); >$ext = explode(".", $entryName); if(!empty($ext[1])) < $dirArray[] = $docRoot.$inputDirectory."/".$entryName; >> // close directory closedir($directory); $found = false; if(is_array($dirArray))< foreach($dirArray as $current)< $myFile = file_get_contents($current); $myFile = str_replace("", "", $myFile); if(preg_match("/function ".$function."/", $myFile)) < $found = true; $foundLocation = $current; break; >> > if($found) < echo $foundLocation; exit; >else if(is_array($folderArray)) < foreach($folderArray as $folder)< if(!isset($return))< $return = findFunction($function, $inputDirectory."/".$folder); >else if($return == false) < $return = findFunction($function, $inputDirectory."/".$folder); >> > else < return false; >> findFunction("testFunction", "rootDirectory"); 

Надеюсь, это поможет кому-то. Если фактическая функция находится за пределами httpdocs, она не может быть найдена, потому что сервер будет настроен так, чтобы не разрешать ее. Проверяли только одну папку, но рекурсивная методология должна работать теоретически.

Это похоже на версию 0.1, но я не намерен продолжать ее разработку, поэтому, если кто-то обновляет ее, он может перепроверить ее.

Источник

Оцените статью