Допустим, у меня есть:
class Zebra{ public static function action(){ print 'I was called from the '.get_class().' class'; // How do I get water here? } } class Water{ public static function drink(){ Zebra::action(); } } Water::drink();
Как получить «воду» из класса зебры?
(Это для php 5.3)
Одно не очень хорошее решение: используйте __METHOD__
или __FUNCTION__
или __CLASS__
. и передать его как параметр вызываемой функции. http://codepad.org/AVG0Taq7
<?php class Zebra{ public static function action($source){ print 'I was called from the '.$source.' class'; // How do I get water here? } } class Water{ public static function drink(){ Zebra::action(__CLASS__); } } Water::drink(); ?>
Вы можете получить информацию о вызывающем debug_backtrace
от debug_backtrace
http://php.net/manual/en/function.debug-backtrace.php
Полнофункциональное решение с использованием исключения, но не debug_backtrace, не нужно изменять какой-либо прототип:
function getRealCallClass($functionName) { try { throw new exception(); } catch(exception $e) { $trace = $e->getTrace(); $bInfunction = false; foreach($trace as $trace_piece) { if ($trace_piece['function'] == $functionName) { if (!$bInfunction) $bInfunction = true; } elseif($bInfunction) //found !!! { return $trace_piece['class']; } } } } class Zebra{ public static function action(){ print 'I was called from the '.getRealCallClass(__FUNCTION__).' class'; } } class Water{ public static function drink(){ Zebra::action(); } } Water::drink();