2016-06-29 6 views
0

ここでよくお勧めするチュートリアルBuild a PHP MVC Applicationを実行し、短縮されたifステートメントのコード行に、?:を使用して実行しました。私はこの種の短いコードにはあまり慣れていないので、私はそれをどのように書くのか再作成しようとしました。コードの行を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)); 
     } 
    } 
    } 
+2

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

+0

最初のコードは' $ url'の内容を 'true'でチェックすることを説明することが重要です。あなたの例は、変数が設定されているかどうかだけをチェックします。そして、条件がうまくいかない場合( 'else')には解決策を提示しませんでした。とにかく、通信員は@ splash58のようにコメントされています。 – FirstOne

+0

そのフォーマットは '$ variable = $ condition? $ value_if_true:$ value_if_false' – morcen

答えて

3

if (isset($url))は、設定された変数の存在をチェックします。

if ($url)は、変数自体から真実の値をチェックします。

あなたはところでif ($url)

を使用する必要があり、あなたに不慣れだコードがternary statementと呼ばれています!これは他のいくつかの言語(Rubyなど)で共通しており、どのように動作するかを知ることは有益です。

真理値について私が何を意味するのかわからない場合は、boolean castingについての詳細を読む必要があります。

+0

前に宣言されていなかった場合、 'if($ url)'はエラーをスローしませんか?あるいは、 'if($ arr ['myUndefinedKey'])'のような配列にアクセスしようとする場合に限ります。申し訳ありませんが、それを試してみることもできますが、今は書いています。 – lexith

+1

@lexith通知をトリガーしますが、NULLにする – sjagr

+0

ありがとう、ちょうどそれを試してみました:)このwasn ' PHP 4やsthのような古いPHPバージョンでの動作? PHPStormも未定義とマークされているので、これはベストプラクティスではありません。つまり、 '(isset($ url)&& $ url)'は実際にはうまくいかないでしょうか? – lexith

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

+0

'$ this-> params []'はクラスヘッダ( 'protected $ params = []')に既に定義されています(完全なコードを投稿していないのは申し訳ありません。 ($ url) '文を使用します。私は 'isset()'を使う必要はなかったと思います。ありがとう! – Max

1

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

セミコロンがありません – morcen

+0

ありがとうございました。 –

+0

あなたの返信は、isset()を除いて、他のコメントとほぼ一致します。 (これは必ずしも悪いことではありません、考えてくれてありがとう!) – Max

1

issetPhpではvariavbledefinedかではありませんチェックするために使用されます。それはちょうどreturntrueとfalseに基づいてvariableに基づいて定義されています。あなたがmultiple conditionsの代わりを持っている場合ternaryopreators

Ternary operatorsを書くことは何もなく、より便利ですif-elseの短い形式ではない他の手でhttp://php.net/manual/en/function.isset.php

をお読みくださいissetについての詳細情報については

はusedfulですif-elseを使用すると、この例のようにternaryを使用できます。

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

これで複数条件を結ぶことができます

+0

これは、将来の三項演算子との出会いに非常に便利です。私はまだ完全なif/else文を書く必要があると感じています。なぜなら、読みやすく、必要に応じて、後に角括弧内にコードを追加する方法があると思いますからです。 – Max

関連する問題