PHP:速记开关

PHP:速记开关,php,function,class,switch-statement,Php,Function,Class,Switch Statement,我正在寻找更舒适/更简短的Switch()语句版本,以防使用多个函数 我给你举一个例子:假设一个类中有100-200个函数,你只想通过在该类中将value设置为id来调用其中一个函数 在我的特殊情况下,PHP文件的结构如下: <?php class _main { function request($id) { switch($id) { case 0:

我正在寻找更舒适/更简短的
Switch()
语句版本,以防使用多个函数

我给你举一个例子:假设一个类中有100-200个函数,你只想通过在该类中将value设置为
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遍也不会让我觉得有趣)


结论

  • 最好的、快速的、舒适的方法是什么

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

  • 它会影响性能吗?会更快吗

谢谢:)

编辑


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

我不能说我会推荐这种方式,但是如果您真的希望在单个类中有那么多方法和单个函数来路由调用

<?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();
我觉得很有可能有另一种方法来实现这一点,即利用
接口
抽象
类提供更多信息,但有了这些信息,上述内容可能满足您的要求


编辑:很遗憾,我现在没有时间提出详细的解决方案,而且我也没有足够的信息来进行编辑,但也许利用接口是满足您需求的最佳解决方案。下面是一个非常简单的例子

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

如果我班上有100-200个方法,我会开始重新思考我的体系结构。这些方法有很大的不同吗?(我假设它们包含的不仅仅是
echo
IRL)。这是干什么用的?这个班应该做什么?哈哈,我没有那么多的PHP经验,所以…:)在一个类中有那么多的方法是不是很糟糕?是的,它们包含不同的函数。。例如,我需要使用数据库的函数,使用var类型的不同转换返回不同的值,加入2个或更多请求,等等…+1个好答案。这都是关于我的代码的架构,可以用非常不同的方式来完成。所以,我真的很有兴趣学习一些关于PHP代码的接口和体系结构等方面的知识。我还没有使用任何框架。。例如,我如何使用
?id=…
url参数使用接口向
get.php
(仅举个例子)发出请求?顺便说一句,使用大型类对web服务器来说非常昂贵。再一次,感谢您的回答,@鸽子无忧@MaxWater您可以使用某种形式的透视表来处理映射,其中
ID
使用
接口
。如果你不想使用数据库,尽管可能使用
常量
数组将ID映射到界面,我会快速更新我的初始帖子。好主意!我会试试看,这对我来说是个好的开始!干杯!:)
<?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');
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) {}