【发布时间】:2014-02-14 14:56:54
【问题描述】:
我有很多基于属性值调用的方法。我想知道是否有更正确的方法来做我正在做的事情?
我现在的代码:
if ($qvalue->fid == 1) { $this->Archive1(); }
if ($qvalue->fid == 2) { $this->Archive2(); }
if ($qvalue->fid == 3) { $this->Archive3(); }
if ($qvalue->fid == 4) { $this->Archive4(); }
if ($qvalue->fid == 5) { $this->Archive5(); }
if ($qvalue->fid == 6) { $this->Archive6(); }
if ($qvalue->fid == 7) { $this->Archive7(); }
if ($qvalue->fid == 8) { $this->Archive8(); }
if ($qvalue->fid == 9) { $this->Archive9(); }
if ($qvalue->fid == 10) { $this->Archive10(); }
...
我可以这样做吗:
$this->Archive($qvalue->fid)();
我知道这行不通,我只是不确定是否有更好的方法。甚至不确定要搜索什么才能看到其他类似的帖子。
【问题讨论】:
-
这取决于
Archive9(), Archive10()中的内容等等 -
我只是想知道是否有更好的方法来调用/运行 Archive9() 方法。里面有什么应该无关紧要。
-
重要的是,拥有一堆做同样事情的函数(只是使用大概不同的数据)是一个错误的设计。它不值得一提。如果差异是数据,那么它们应该是一种方法,出于同样的原因
$item1,$item2,$item3... 实际上应该是一个数组。 (如果您不喜欢将参数传递给每个函数,那么您可以将它们存储在关联数组的数组中,由$qvalue->fid的值索引。)如果功能不同,那是另一回事。 (但这也意味着你的 names 坏了。) -
归档方法分布在几个扩展类中,这就是我使用方法的原因,因此父类可以调用扩展类内部的方法。扩展类可能因安装此脚本而异。
-
PHP 在类似的事情上非常灵活。如果您有一个像
$method = [$obj, 'doStuff'];这样的数组,那么该数组是一个可调用,并且$method()与$obj->doStuff()做同样的事情。同样,对于$f = ['ClassName', 'doStaticStuff'];,$f()的作用类似于ClassName::doStaticStuff()。
标签: php class methods properties