如何获得非继承的 PHP class 方法?
How to get non inherited PHP class methods?
我想要获得非继承子 class public 方法。我试过像这样使用反射 Api:
$class = new \ReflectionClass($model);
$modelMethods = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
$exclude = ['getSource', 'upsert', 'getUniqueKeyAttributes', 'beforeSave', 'columnMap', 'initialize', 'setId', 'getId'];
$CLASS = __CLASS__;
$props = array_filter(array_map(function(\ReflectionMethod $method) use ($exclude, $CLASS) {
if($method->class === $CLASS && !in_array($method->name, $exclude)) {
if(strpos($method->name, 'get') === 0) {
return str_replace('get', '', $method->name);
}
}
}, $props));
但是这样就产生了很多多余的逻辑。我必须自动获取所有的 getter 或 setter,因为我得到了 60 多个!
1。坚持现有解决方案
我只是将 array_filter
替换为 array_map
以获得更有效的内部过滤。当您 100% 控制它时声明函数参数的类型不是必需的,但会减慢 PHP。另外 substr()
应该比 str_replace()
.
出现得更快
让我来支持一个完全相同但又不同的代码的简短示例:
$class = 'Application\Entity\ExamplePhalconModel';
// ure filtering those with "get" only
$exclude = array_flip(['getSource', 'getId']);
$result = array_map(function($v) { return substr($v->name, 3); } , array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($v) use ($class, $exclude) {
return (strpos($v->name, 'get') === 0 && $v->class === $class) && !array_key_exists($v->name, $exclude);
}));
分解,首先,我正在创建一个 class 的反射,正像您所做的那样用 (new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC)
检查。将其作为 array_filter()
的第一个参数允许我省略一些变量声明。作为第二个参数,只是函数中的 if
:
function ($v) use ($class, $exclude) {
return (strpos($v->name, 'get') === 0 && $v->class === $class) && !array_key_exists($v->name, $exclude);
}
用于检查它是否完全以“get”开头,它是否正确class,最后,它是否不在排除的方法名称中。
最后,整个 array_filter()
结果转到 array_map()
只是为了将它们从对象变形为不包含“get”字的字符串;
PS:主要是进一步优化和混淆;)
2。菲尔康 Model::columnMap
或者只是:
$props = array_map(function($str) {
return \Phalcon\Text::camelize($str);
}, array_values(Application\Entity\ExamplePhalconModel::columnMap()));
但您可能需要过滤掉一个 'Id' 字段;
我想要获得非继承子 class public 方法。我试过像这样使用反射 Api:
$class = new \ReflectionClass($model);
$modelMethods = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
$exclude = ['getSource', 'upsert', 'getUniqueKeyAttributes', 'beforeSave', 'columnMap', 'initialize', 'setId', 'getId'];
$CLASS = __CLASS__;
$props = array_filter(array_map(function(\ReflectionMethod $method) use ($exclude, $CLASS) {
if($method->class === $CLASS && !in_array($method->name, $exclude)) {
if(strpos($method->name, 'get') === 0) {
return str_replace('get', '', $method->name);
}
}
}, $props));
但是这样就产生了很多多余的逻辑。我必须自动获取所有的 getter 或 setter,因为我得到了 60 多个!
1。坚持现有解决方案
我只是将 array_filter
替换为 array_map
以获得更有效的内部过滤。当您 100% 控制它时声明函数参数的类型不是必需的,但会减慢 PHP。另外 substr()
应该比 str_replace()
.
让我来支持一个完全相同但又不同的代码的简短示例:
$class = 'Application\Entity\ExamplePhalconModel';
// ure filtering those with "get" only
$exclude = array_flip(['getSource', 'getId']);
$result = array_map(function($v) { return substr($v->name, 3); } , array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($v) use ($class, $exclude) {
return (strpos($v->name, 'get') === 0 && $v->class === $class) && !array_key_exists($v->name, $exclude);
}));
分解,首先,我正在创建一个 class 的反射,正像您所做的那样用 (new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC)
检查。将其作为 array_filter()
的第一个参数允许我省略一些变量声明。作为第二个参数,只是函数中的 if
:
function ($v) use ($class, $exclude) {
return (strpos($v->name, 'get') === 0 && $v->class === $class) && !array_key_exists($v->name, $exclude);
}
用于检查它是否完全以“get”开头,它是否正确class,最后,它是否不在排除的方法名称中。
最后,整个 array_filter()
结果转到 array_map()
只是为了将它们从对象变形为不包含“get”字的字符串;
PS:主要是进一步优化和混淆;)
2。菲尔康 Model::columnMap
或者只是:
$props = array_map(function($str) {
return \Phalcon\Text::camelize($str);
}, array_values(Application\Entity\ExamplePhalconModel::columnMap()));
但您可能需要过滤掉一个 'Id' 字段;