why.xingtongworld.com项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

124 lines
3.7 KiB

<?php
//------------------------
// 读取类文件
//-------------------------
class ReadClass
{
private static $errormsg;
/**
* 根据类名获取public方法
* @param string $class 类名
* @param bool $parents 是否获取父类方法,默认false
* @return array|bool
*/
public static function method($class, $parents = false)
{
if (!class_exists($class)) {
self::$errormsg = $class . "类不存在";
return false;
}
$reflection = new \ReflectionClass($class);
$class_name = $reflection->name;
$staticProperties = $reflection->getStaticProperties();
// 黑名单方法
$blacklist = isset($staticProperties['blacklist']) ? $staticProperties['blacklist'] : [];
$ret = [];
//遍历public方法
foreach ($reflection->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
if ($parents || (!$parents && $method->class == $class_name)) {
if (substr($method->name, 0, 2) != '__' && !in_array(strtolower($method->name), $blacklist)) {
//根据phpDoc获取方法说明
$title = '';
$docComment = $method->getDocComment();
if ($docComment !== false) {
$docCommentArr = explode("\n", $docComment);
$comment = trim($docCommentArr[1]);
$title = trim(substr($comment, strpos($comment, '*') + 1));
}
$ret[] = ['name' => $method->name, 'title' => $title];
}
}
}
return $ret;
}
/**
* 读取某个路径的类和方法
* @param string $path
* @param bool $parents
* @return array|bool
*/
public static function readFile($path, $parents = false)
{
if (!file_exists($path)) {
self::$errormsg = $path . "文件不存在";
return false;
}
$class = str_replace([realpath(APP_PATH), ".php", DS], [config("app_namespace"), "", "\\"], realpath($path));
$method = self::method($class, $parents);
if ($method) {
$class_name = explode("\\", $class);
return ["class" => $class, "class_name" => end($class_name), "method" => $method];
}
return false;
}
/**
* 读取某个文件夹里所有的类与方法
* @param $dir
* @param array $filter
* @param bool $parents
* @return array|bool
*/
public static function readDir($dir, $filter = [], $parents = false)
{
if (!is_dir($dir)) {
self::$errormsg = $dir . "路径不存在";
return false;
}
$file_list = self::listDir($dir, true);
$ret = [];
foreach ($file_list as $file) {
$method = self::readFile($file, $parents);
if ($method && !in_array($method['class_name'], $filter)) {
$ret[$method['class_name']] = $method;
}
}
return $ret;
}
/**
* 列出某个目录下的文件
* @param string $dir 目录
* @param bool $recursion 是否递归
* @return array
*/
public static function listDir($dir, $recursion = true)
{
$dirInfo = [];
if (is_dir($dir)) {
foreach (glob($dir . DS . '*') as $v) {
if ($recursion && is_dir($v)) {
$dirInfo = array_merge($dirInfo, self::listDir($v));
} else {
$dirInfo[] = $v;
}
}
}
return $dirInfo;
}
/**
* 读取错误信息
* @return mixed
*/
public static function getError()
{
return self::$errormsg;
}
}