PHP:速记开关

时间:2017-06-08 11:08:11

标签: php function class switch-statement

如果使用多个功能,我正在寻找更舒适/更短的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);

?>

对于你们中的一些人来说,这可能看起来很奇怪,但我不想让casebreak拥有那么多代码。对我来说,他们只是让代码更难以阅读。

(顺便说一句,写100次也不会让我觉得有趣)。

结论

  • 什么是最好,快速和舒适的方法?

  • 我可以将函数存储到数组然后调用它们吗?

  • 它会影响性能吗? Swicth()会更快吗?

谢谢:)

修改

也许有一种不同的思考/编码方式,而不仅仅是阵列/切换事物。

1 个答案:

答案 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.

我觉得最有可能采用InterfacesAbstract类来获取更多信息来解决这个问题,但是上述信息可能足以满足您的要求。

编辑:可悲的是,我现在没有时间提出详细的解决方案,而且我还没有足够的信息可以使用,但可能还没有使用接口是您的最佳解决方案。以下是非常快速示例。

<?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'];