Если пользователь передает объект в myprintr (), вы можете использовать
if (is_object($arg)) {
$className = get_class($arg);
}
, чтобы получить имя типа объекта, который был передан, который затем можно передать в отражение
но конструктор отражения примет либо имя класса , либо объект в качестве аргумента, поэтому вам даже не нужно имя класса для создания экземпляра класса отражения
EDIT
Просто для того, чтобы немного поиграть с этой концепцией (и не создавать какой-либо зависимости от глобальных переменных) или узнать, являются ли аргументы переменными, значениями, возвращаемыми из функций, строк и т. Д .:
class Test{};
function myTest() {
$some_object = new Test();
myprintr($some_object);
}
function myprintr(){
$callStack = debug_backtrace();
$calledAt = $callStack[0];
$callingFile = file($calledAt['file'],FILE_IGNORE_NEW_LINES);
$callingLine = $callingFile[$calledAt['line']-1];
$callingLine = substr($callingLine,strpos($callingLine,__METHOD__));
$calledWithArgNames = trim(substr($matches[0],1,-1));
var_dump($calledWithArgNames);
$args = func_get_args();
foreach($args as $arg) {
var_dump($arg);
}
}
myTest();
$some_object = new Test();
$some_other_object = &$some_object;
$t = 2;
$gazebo = "summer house";
$visigoth = pi() / 2; myprintr($some_other_object,pi(), atan2(pi(),$t), $visigoth, "Hello $t World", $gazebo); $t = log($t/$visigoth);
Получает все аргументы, переданные вызывающей функцией в $ namedWithArgNames, поэтому для первого вызова, который у вас есть:
'$some_object'
и для второго звонка:
'$some_other_object,pi(), atan2(pi(),$t), $visigoth, "Hello $t World", $gazebo'
Это по-прежнему требует разделения на отдельные аргументы (preg_split на запятые, кроме случаев, когда они внутри скобок), но, безусловно, на шаг ближе к тому, что вы на самом деле запрашиваете.