【问题标题】:Call a method based on the value of a property根据属性的值调用方法
【发布时间】: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


【解决方案1】:
$method = 'Archive' . $qvalue->fid;
if (method_exists($this, $method))
{
    $this->$method();
}

【讨论】:

  • 我刚刚进行了一些测试,效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多