如果使用多个功能,我正在寻找更舒适/更短的Switch()
语句版本。
我将举一个例子:在一个类中设想100-200个函数,并且只想通过在该类中将值设置为id
来调用其中一个函数。
在我的特定情况下,我有以下PHP文件结构:
<?php
class _main
{
function request($id)
{
switch($id)
{
case 0:
$this->writeA();
break;
case 1:
$this->writeB();
break;
///...
// then we have 100-200 functions like this in switch.
}
}
function writeA()
{
echo('a');
}
function writeB()
{
echo('b');
}
}
$id = 1;
$x = new _main();
$x->request($id);
?>
对于你们中的一些人来说,这可能看起来很奇怪,但我不想让case
和break
拥有那么多代码。对我来说,他们只是让代码更难以阅读。
(顺便说一句,写100次也不会让我觉得有趣)。
结论
什么是最好,快速和舒适的方法?
我可以将函数存储到数组然后调用它们吗?
它会影响性能吗? Swicth()
会更快吗?
谢谢:)
修改
也许有一种不同的思考/编码方式,而不仅仅是阵列/切换事物。
答案 0 :(得分:2)
我不能说我会推荐这个,但是如果你真的想在单个类中使用很多方法并使用单一函数来通过...来路由调用...
<?php
class MyClass
{
public $id;
public function callFunction()
{
$funcName = 'execute' . $this->id;
return $this->$funcName();
}
private function execute1()
{
echo 'execute1() Called.';
}
private function execute2()
{
echo 'execute2() Called.';
}
}
$c = new MyClass();
$c->id = 1;
$c->callFunction();
输出:
execute1() Called.
我觉得最有可能采用Interfaces
和Abstract
类来获取更多信息来解决这个问题,但是上述信息可能足以满足您的要求。
编辑:可悲的是,我现在没有时间提出详细的解决方案,而且我还没有足够的信息可以使用,但可能还没有使用接口是您的最佳解决方案。以下是非常快速示例。
<?php
interface WritableInterface
{
public function write($data);
}
class VersionOneWriter implements WritableInterface
{
public function write($data)
{
return $data . '<br/>';
}
}
class VersionTwoWriter implements WritableInterface
{
public function write($data)
{
return $data . $data . '<br/>';
}
}
class MyMainClass
{
public function request(WritableInterface $writer, $data)
{
return $writer->write($data);
}
}
$c = new MyMainClass();
$w1 = new VersionOneWriter();
$w2 = new VersionTwoWriter();
echo $c->request($w1, 'DataString');
echo $c->request($w2, 'DataString');
基本上当你调用你的请求函数时,你会传递一个实现Writer
的{{1}}类。实现该接口的任何东西都必须有WritableInterface
方法。
现在,当您使用方法传递数据时,由于您还传递了一个可以处理数据的编写器,您可以在write()
方法中安全地调用->write($data)
,结果将依赖于在你通过的课程上。
如果你需要另一种写作方法,你可以添加另一个request()
来实现你的class
希望这有点意义,因为我必须消失一点,这有点絮絮叨叨。如果您有任何问题,我会在有空的时候回来查看。
-
<强> EDIT2:强>
此实例中的interface
需要PHP7 +,因为我定义了一个数组,但您可以在PHP7之前使用标准数组。 define()
$classMap = ['FirstClass', 'SecondClass'];