Как раз сегодня случилось, что нам нужен инструмент для изучения исходного кода
PHP работает на лету и не видит ничего интересного,
Я собрал вместе класс, вставленный ниже, который использует некоторые классы отражения PHP.
Он не только даст вам исходный код функции PHP, на лету,
но это также даст вам подробную информацию о параметрах функции (если доступно)
Так что, если функция, которую вы запрашивали, была примерно такой ...
function nearby($lat=41.1663079,$lng=-113.8584736,$distance=150)
{
....
....
}
... Класс должен быть в стороне от источника функции, подробно
информация о поле, как это ...
Array( [lat] => Array( [position] => 0
[name] => lat
[type] => string
[default] => 41.1663079
[optional] => 1
[byreference] => 0 )
[lng] => Array( [position] => 1
[name] => lng
[type] => string
[default] => -113.8584736
[optional] => 1
[byreference] => 0 )
[distance] => Array( [position] => 2
[name] => distance
[type] => string
[default] => 150
[optional] => 1
[byreference] => 0 ) )
Классы отражения PHP плохо документированы (часто нет документации),
но было достаточно того, что с небольшим волнением сегодня, то же самое позволило создание
класса PHP "func_def" ниже.
Я создал его для поддержки больших усилий, которые позволяют мне безопасно вызывать функции PHP в режиме реального времени из Javascript с проверкой типов и тому подобным.
Наслаждайтесь!
Пример:
$function_inspector =new func_def('whatever_function_name');
print "the function's source code is \n\n"
.$function_inspector->func_get_code() ;
print "the function's argument details are ".print_r($function_inspector->func_get_args());
/*
**
** The cool func_def class
** Scribbled up by :Dr. Clue
**
*/
class func_def extends ReflectionFunction
{//http://php.net/manual/en/class.reflectionfunctionabstract.php
protected $sz_fun_name =NULL ;
protected $bExists =FALSE ;
function __construct($func_name)
{
$this->sz_func_name=$func_name;
if(!function_exists($func_name))return;
try {parent::__construct($func_name); $this->bExists=TRUE;}
catch(Exception $e) {$this->bExists=FALSE; return; }
} // End Functon __constructor
function function_valid() { return $this->bExists==TRUE; }
function func_get_code()
{ // Returns Function's source code
if(!$this->bExists){return "/* function does not exist */";}
$line_start =$this->getStartLine() - 1;
$line_end =$this->getEndLine();
$line_count =$line_end - $line_start;
$line_array =file($this->getFileName());
return implode("", array_slice($line_array,$line_start,$line_count));
} // End Function
function func_get_args()
{ // Returns a fairly detailed descript of function arguments
$aParamerters=Array();
if(!$this->bExists)return $aParamerters;
foreach($Params=$this->getParameters() as $k=>$v)
{
$item= Array();
$s_export=array_pop($a=(array)$v->export($this->getName(),$v->getName(),TRUE) );
preg_match('/[^#]+[#]([0-9]+)/',$s_export,$m,PREG_OFFSET_CAPTURE);
$item["position"]=$m[1][0];$item["name" ]=$v->getName();$item["default" ]=$item["type" ]=NULL;
if(($item["optional"]=intVal($v->isOptional()) )==1)
if(preg_match('/[^[]+[^=]+=([^\]]+)/',$s_export,$m,PREG_OFFSET_CAPTURE))
{$item["default"]=($ev=trim($m[1][0]));$ev=("\$a=$ev;");eval($ev);$item["type"]=gettype($ev);}
if($item["type" ]==NULL)
if(preg_match('/[^[]+[\[][^>]+[> ]+([^&$]+)/',$s_export,$m,PREG_OFFSET_CAPTURE))$item["type"]=($ev=trim($m[1][0]));
$item["byreference"]=intVal(strpos($s_export,'&$')!==FALSE);
$aParamerters[$v->getName()]=$item;
}
return $aParamerters;
}
function func_num_args() {if(!$this->bExists)return FALSE;return $this->getNumberOfParameters() ;}
function func_num_args_required(){if(!$this->bExists)return FALSE;return $this->getNumberOfRequiredParameters();}
} // End Class