search

Home  >  Q&A  >  body text

php - 如何更优雅的写这段代码

<?php
$command = (int)$_GET['command'];

$actions = array(
    1 => 'profile',
    3 => 'login',
    7 => 'show',
    9 => 'update',
    11 => 'stop',
    13 => 'start',
    15 => 'remove',
);

//判断命令对应的动作是否存在
if (!array_key_exists($command, $actions)) throw new Exception('404');

$control = new App();
$method = 'on' . ucfirst($actions[$command]);

//判断类里面是否存在该函数
if (!method_exists($control, $method)) throw new Exception('404');
大家讲道理大家讲道理2897 days ago462

reply all(3)I'll reply

  • 怪我咯

    怪我咯2017-04-10 15:18:59

    凭感觉猜测题主是需要一个简洁的分发,那么可以考虑

    phpclass App {
      protected static $actions = [
        1 => 'onProfile',
        2 => 'onLogin',
        //...
      ];
    
      public function run($command) {
        if (!isset(self::$actions[$command])) { throw ...; }
        $callback = [$this, self::$actions[$command]];
        if (!is_callable($callback)) { throw ...; }
    
        call_user_func($callable);
      }
    }
    
    
    //index.php
    
    new App()->run($_GET['command']);
    

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:18:59

    先指出一点错误, 一般检测类似controller这种类方法是否可以被调用, 需要使用is_callable而不是method_exists, 前者检查方法是否可以被调用(存在且公开), 后者只是单纯检查方法是否存在。

    class NotFoundException extends Exception {}
    
    $command = $_GET['command'] ?: false;
    
    $actions = array(
        'profile',
        'login',
        'show',
        'update',
        'stop',
        'start',
        'remove',
    );
    
    //判断命令对应的动作是否存在
    if ( ! in_array($command, $actions)) 
        throw new NotFoundException();
    
    $control = new App();
    $method = 'on' . ucfirst($command);
    
    //判断类里面是否存在该函数
    if ( ! is_callable(array($control, $method)))
        throw new NotFoundException();
    

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:18:59

    看看 Flight 框架 也是另外一种思路

    reply
    0
  • Cancelreply