用if语句替换一行代码

时间:2016-06-29 17:35:17

标签: php model-view-controller

我已经按照这里经常推荐的教程Build a PHP MVC Application进行了操作,然后我遇到了一行代码,它是使用?:缩短的if语句。由于我对这种短代码并不熟悉,所以我试着重新创建它,我会怎么写它。

$this->params = $url ? array_values($url) : [];

我想出了:

    if(isset($url))
    {
      $this->params = array_values($url);
    }

这是完全相同的吗?或者我错过了什么?它起作用,看起来它也在做同样的事情,但我想肯定地知道。

由于某些答案取决于$ url的状态,因此这里是完整的代码:

<?php
  class App
  {

    protected $controller = 'home';
    protected $method = 'index';
    protected $params = [];

    public function __construct()
    {
      $url = $this->parseUrl();

      if(file_exists('../app/controllers/' . $url[0] . '.php'))
      {
        $this->controller = $url[0];
        unset($url[0]);
      }

      require_once '../app/controllers/' . $this->controller . '.php';

      $this->controller = new $this->controller;

      if(isset($url[1]))
      {
        if(method_exists($this->controller, $url[1]))
        {
          $this->method = $url[1];
          unset($url[1]);
        }
      }

      $this->params = $url ? array_values($url) : [];

      call_user_func_array([$this->controller, $this->method], $this->params);
    }

    public function parseUrl()
    {
      if(isset($_GET['url']))
      {
        return $url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
      }
    }
  }

4 个答案:

答案 0 :(得分:3)

if (isset($url))将检查是否存在设置变量。

if ($url)将检查变量本身的真值。

您应该使用if ($url)

顺便说一下,您不熟悉的代码称为ternary statement!它在其他一些语言(例如Ruby)中很常见,了解它的工作方式很有用。

如果你不知道我对真实价值的看法,你应该阅读更多关于boolean casting的内容。

答案 1 :(得分:1)

最简洁的方式是:

$this->params = [];
if($url) {
    $this->params = array_values($url);
}

或者

if($url) {
    $this->params = array_values($url);
}
else {
    $this->params = [];
}

它被称为三元声明。 [value] = [condition] ? [if true] : [else]

http://php.net/manual/en/language.operators.comparison.php

答案 2 :(得分:1)

相当于:

 if(isset($url))
 {
     $this->params = array_values($url);
 } else {
     $this->params = [];
 }

答案 3 :(得分:1)

Php isset用于检查variavble是否为defined。它只是return true而基于variable的错误是定义与否。

有关isset的详情,请参阅http://php.net/manual/en/function.isset.php

另一方面ternary opreators只是if-else的简短形式,写起来更方便

如果你有Ternary operators,那么

multiple conditions是有用的,而不是使用多个if-else,你可以使用ternary,就像看到这个例子一样

$data= ($value== 1) ? "one" : (($value== 2)  ? "two" : "other");

你可以在这个

中连接多个条件