PHP:速记开关

标签 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() 会更快吗?

谢谢你:)

编辑

也许有不同的思维/编码方式,而不仅仅是数组/开关。

最佳答案

我不能说我会推荐这个但是如果你真的想要在一个类中有那么多方法和一个单一的函数来路由调用......

<?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 类来获取更多信息,但是如果不包含上述信息,可能就足够了要求。


编辑:遗憾的是,我现在没有时间想出一个详细的解决方案,而且我确实没有足够的信息可以使用,但也许利用接口(interface)是你最好的解决方案为您的要求。下面是一个非常的简单示例。

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

本质上,当您调用请求函数时,您传递了一个实现了 WritableInterfaceWriter 类。任何实现该接口(interface)的东西都必须有一个 write() 方法。

现在,当您使用方法传递数据时,由于您还传递了一个可以处理数据的编写器,因此您可以在 中安全地调用 ->write($data) request() 方法,结果将取决于您通过的类。

如果您需要另一种编写方法,您可以添加创建另一个实现您的接口(interface)

希望这是有道理的,因为我必须消失一会儿所以有点漫无目的。如果您有任何问题,我会在有空时尝试回来查看。

--

编辑2: 本例中的 define() 需要 PHP7+,因为我正在定义一个数组,但在 PHP7 之前,您可以只使用标准数组。 $classMap = ['FirstClass', 'SecondClass'];

interface MyInterface {}
class FirstClass implements MyInterface {}
class SecondClass implements MyInterface {}

$requestParam = 1;

define('CLASS_MAP', array(
    'FirstClass',
    'SecondClass',
));

$classMap = CLASS_MAP[$requestParam]; // SecondClass

$class = new $classMap;
var_dump($class); // Dumps out: object(SecondClass)#1 (0) {}

关于PHP:速记开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44434039/

相关文章:

php - 清理和添加字段数量未知的 Post Meta

php - 在 Laravel 5.4 (Eloquent ORM) 中自动删除 NESTED 相关行

php - PHPUnit如何断言函数

javascript - JS函数变量中的混合大小写字母

java - 从属性指定数组列表类型

php - 使用 Symfony2 为主应用程序生成翻译目录

php - 拉拉维尔 7 : array validation messages with wildcard index

javascript - 未捕获的语法错误 : Unexpected token return - still no answer?

java - 通用 setter 方法不兼容类型错误

java - 从类节点获取字符串找不到符号