我的课程看起来像这样:
class Foo
{
puclic static function blindPaths($paths)
{
foreach($paths as $name=>$path)
{
$method='set'.ucfirst($name).'Path';
if(method_exists(????,$method))
self::$method($path);
}
}
public function setBasePath($base)
{
//do something...
}
public function setAppPath($app)
{
//do something...
}
....
}
现在,我打电话给:
$paths = array(
'base'=>'path.of.base.path',
'app'=>'path.of.app.path',
'someValue'=>'path.of.someValuePath',
....
);
Foo::blindPaths($paths);
检查method_exists时出现问题,填写那些标记的内容“????”有人可以帮帮我吗?
答案 0 :(得分:2)
if(method_exists(__CLASS__, $method))
答案 1 :(得分:1)
在简单的单类情况下,您可以使用__CLASS__
常量作为method_exists
调用的第一个参数,但是如果您处于在父类中定义静态方法的情况等级(或抽象类,或其他地方),那么也许你可能想要考虑这个:
puclic static function blindPaths($paths)
{
$current = get_called_class();
foreach($paths as $name=>$path)
{
$method='set'.ucfirst($name).'Path';
if(method_exists($current,$method))
self::$method($path);
}
}
或者,如果你将界面和Trait
添加到混合中:
puclic static function blindPaths($paths)
{
$current = get_called_class();
$current = new $current;//create instance
foreach($paths as $name=>$path)
{
$method='set'.ucfirst($name).'Path';
if($current instanceof Foo)
self::$method($path);
elseif ($current instanceof Bar)
return $this->{$method}($path);
}
}
但无论如何,重新考虑你的设计。如果你使用的结构类似于现在的结构,那么10次中有9次,你正在咆哮错误的树。