$argv[1] の真偽判定

このQ&Aのポイント
  • PHP初心者が、$argv[1]を使った条件分岐の結果に疑問を持っている。
  • 与えられた引数がfalseの場合でも、真と判定されてしまう問題がある。
  • 質問者は、この問題の原因と解決方法を知りたいと思っている。
回答を見る
  • ベストアンサー

$argv[1] の真偽判定

PHPの勉強を始めた初心者です。 次のようなスクリプトを書いてみたのですが、false と入力しても、真と判定されてしまいます。 何故こうなるのか、お教えいただければ幸いです。 <?php // p075_a.php if( isset($argv[1]) && $argv[1] ) { echo "与えられた引数は真です\n"; } elseif ( isset($argv[1]) && !$argv[1] ) { echo "与えられた引数は偽です\n"; } else { echo "引数が与えられていません\n"; } [study_php@localhost ch03]$ php p075_a.php '' 与えられた引数は偽です [study_php@localhost ch03]$ php p075_a.php "" 与えられた引数は偽です [study_php@localhost ch03]$ php p075_a.php 0 与えられた引数は偽です [study_php@localhost ch03]$ php p075_a.php 0.0 与えられた引数は真です [study_php@localhost ch03]$ php p075_a.php false 与えられた引数は真です [study_php@localhost ch03]$

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • bx2
  • ベストアンサー率47% (97/206)
回答No.2

空と"0"以外の文字列はすべて真です。 > と bool型にキャストしても同じ結果になるのですが、これは何故なのでしょうか? bool型にキャストする前から真なので、キャスト後も真です。

参考URL:
http://jp.php.net/manual/ja/language.types.boolean.php
study-php
質問者

お礼

理由が分かりました。 どうもありがとうございました。m(__)m

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

"false" という文字列は真です。

study-php
質問者

補足

回答いだだき、ありがとうございます。 <?php // p075_a.php if( isset($argv[1]) and (bool)$argv[1] ) { echo "与えられた引数は真です\n"; } elseif ( isset($argv[1]) && !(bool)$argv[1] ) { echo "与えられた引数は偽です\n"; } else { echo "引数が与えられていません\n"; } と bool型にキャストしても同じ結果になるのですが、これは何故なのでしょうか?

関連するQ&A

  • $argv[1]) && $argv[1]・同じ

     以下のプログラムですが! <html> <head> <meta "charset=utf-8" /> <title>論理演算子</title> </head> <body> <?php if(isset($argv[1]) && $argv[1]) { echo '与えられた引数は真です',PHP_EOL; } else{ echo '引く数が与えられていないか、与えられた引数が真ではありません' ,PHP_EOL; } ?> </body> </html> 以上のプログラムの実行結果は以下となりました。    引く数が与えられていないか、与えられた引数が真ではありません 以上の実行結果は”真でありません”と出ています。    $argv[1]) && $argv[1]・・・&&は理論積の、両辺は同じなのでtrueならばtrueの真だから、  "与えられた引数は真です"と出るのではないんでしょうか!?  以上よろしくお願いします。

    • ベストアンサー
    • PHP
  • どうしたら確認ができますか!?

    以下参考書をそまま入力しました。 ] ---------------------------------------------------  論理積と論理和では、2通りの表記方法がありますが、これは演算子の優先順位(注6)が違います。 (注意6)優先順位については3.2.3(P80)を参照 <?php $flag and foo(); if(isset($argv[1] && $argv[1] { echo '与えられた引数は真です',PHP_EOL; } else{ echo '引数が与えられていないか、与えられた引数が真ではありません' ,PHP_EOL; }  この列では、引数が与えられているかをまずチェックし、与えられている場合はそれが真である かを調べます。論理演算子では、評価結果がわかった時点で演算結果を返します。これを短絡評価 といいます。短絡評価されるため、最初のisset($argv[1])が為である場合、次の$argv[1]の評価 は一切行われません(もし評価されてしまったならば、NOtic:Undefined offset:1となってしまい ます)。  たとえば、次の例では、$flagが為の場合では、関数foo()が呼ばれることはありません。 <?php $flag and foo();   ----------------------------------------------------------- 以上ですが、 これって、どうしたら確認ができますか!?   xamppは働いています。    HTMLで試しましたがParseエラーがでました。 <html> <head> <meta "charset=utf-8" /> <title>論理演算子</title> </head> <body> <?php if(isset($argv[1] && $argv[1] { echo '与えられた引数は真です',PHP_EOL; } else{ echo '引く数が与えられていないか、与えられた引数が真ではありません' ,PHP_EOL; } ?> </body> </html> 以上の実行結果は 以下です。 Parse error: syntax error, unexpected '&&' (T_BOOLEAN_AND), expecting ',' or ')' in C:\xampp\htdocs\study.localhost\php.php on line 10  以上です。    よろしくお願いします。  

    • ベストアンサー
    • PHP
  • = $argv[1];はどんな働きがありますか!?

    <?php // stringcast.php if (!isset($argv[1])) { exit; } $num = $argv[1]; if ($num == 100) {  ←(1) echo "num is 100", PHP_EOL; } else { echo "num is not 100",PHP_EOL; } このプログラムを %php stringcast.php100 のように実行する、引数の100はPHP文字列型として渡されます。  したがって、(1)の比較では、文字列"100"の入って変数$numと、整数100が比較されるため、 文字列"100"は整列100へとキャストされまた後、比較演算が実行されます。  今回は、動作の結果に違いはありませんが、ここで整数同士を比較しているつもりでも実際には 文字列を整数の比較が行われ、キャストが発生している、という挙動を把握しているか、していない かではなく大きな違いがあります。引数とし期待している値の型が決まっている場合、明示的にキャ ストを行い、厳密な比較演算子(===など)を用いるほうが安全です。 -------------------------------------------------------- 以上、参考書をまるごと入力しました。  そこで $num = $argv[1];で!$argv[1]とはこのプログラムではどんな働きがあるのでしょうか!?  ($argv[1];を$numに代入だと思います。間違っていたなら御免なさい。)  宜しくお願いします。  なお・批判的なご回答はお控えくださいませ。  

    • ベストアンサー
    • PHP
  • 命題の真偽

    命題P⇒Qが真となるのは (1) Pが真でQも真 (2) Pが偽であって、Qは真か偽かはどちらでもよい の2パターンがありますよね? 命題P⇒Qが真であることを示せ。といった問題は、 上の(1)・(2)の2つとも成り立つことを示さなくてはならないのですよね? 例えば、高校の数学の教科書にあるような a>b,c>d ⇒ a+c>b+d を証明せよ という問題は、「a>b,c>d ⇒ a+c>b+d」が真であることを証明せよと言っていると思うのですが, 解答では,a>b,c>dが真であることを仮定してa+c>b+dを導いています。 a>b,c>dが偽である場合は考えていませんが、 これは、a>b,c>dが偽の場合、a+c>b+dが真であろうが偽であろうが、いずれにせよ「a>b,c>d ⇒ a+c>b+d」は真となるので、 解答に書く必要がなく、a>b,c>dが真の場合だけを解答に書けばよいからということなのでしょうか? 例えば、 -k<x<k ⇒ x≧-1 が真となるようなkの値の範囲を求めよ。 といった問題があった場合、 (i) k≦0のとき    -k<x<kを満たすxは存在せず(つまり偽であり)、    -k<x<k ⇒ x≧-1 は真 (ii)k>0のとき    -k<x<kを満たすすべてのxが、x≧-1を満たせばよく、    -k≧-1  ∴0<k≦1 以上より、  k≦1  といった具合になると思います。 こういった場合は、Pの部分が偽であることも考慮しますから、 やはり先の証明問題ではPの部分(a>b,c>dが偽の場合)が偽であるときは省略されていると考えるのが妥当なのですかね?

  •  %php stringcast.php 100

    <?php // stringcast.php if (!isset($argv[1])) { exit; } $num = $argv[1]; if ($num == 100) { echo "num is 100", PHP_EOL; } else { echo "num is not 100",PHP_EOL; } このプログラムを %php stringcast.php 100のように実行すると、引数の100は PHPには文字列型として渡されます。・・・  以上参考書にあります。  作業の流れが分かりません。  %php stringcast.php 100とは!何のことなのでしょうか!?  以上宜しくお願いします。

    • ベストアンサー
    • PHP
  • argv内容の表示動作

    プログラミング初心者です。 コンソールアプリケーションのプログラミングの練習として、コマンドライン引数を表示することを考えています。書籍等を参考に手元で入力したソースでは、先頭の一文字しか表示されません。例えば、コマンドラインから > test.exe abc def ghi と入力すると、 > argv[0] = t > argv[1] = a > argv[2] = d > argv[3] = g と表示されます。 環境はWindowsXP + VisualStudio2008で、ソースは下のような具合です。 #include "stdafx.h" int _tmain(int argc, _TCHAR *argv[]){ int i; for ( i = 0; i < argc; i++){ printf("argv[%d] = %s\n", i, argv[i]); } return 0; } どの箇所が原因でこのようになってしまうのでしょうか?

  • is_callable()の第二引数の使い方

    いつもお世話になっています。 PHPの勉強を始めた初心者です。 is_callable()の第二引数の使い方がよく分りません。 true に設定すると、$name が文字列型である場合には、常に bool(true)を返します。 どういう時に、役に立つのでしょうか? お教えいただければ幸いです。 <?php // http://php.net/manual/ja/function.is-callable.php: /* bool is_callable ( callback $name [, bool $syntax_only = false [, string &$callable_name ]] ) syntax_only TRUE の場合、この関数は単に name が関数またはメソッドであるかどうかだけを調べます。 文字列以外の型の変数や不正な形式の配列は、引数として受け付けられません。 */ class someClass { function someMethod() { print "hello from someMethod\n"; } } $varInt = 1; $varString = "string"; $varObject = new someClass(); $varMethod = array($varObject, 'someMethod'); var_dump(is_callable($varInt, true)); // bool(false) var_dump(is_callable($varInt, false)); // bool(false) var_dump(is_callable($varString, true)); // bool(true) var_dump(is_callable($varString, false)); // bool(false) var_dump(is_callable($varMethod, true)); // bool(true) var_dump(is_callable($varMethod, false)); // bool(true) $varObject->someMethod(); [study_php@localhost ch05]$ php is_callable_Test.php bool(false) bool(false) bool(true) bool(false) bool(true) bool(true) hello from someMethod [study_php@localhost ch05]$

    • 締切済み
    • PHP
  • isset関数の動作と入力チェックについて

    issetの動作について疑問に思った事があるので、質問させて下さい。 以下のようなテスト用のphpを作成しました。 issettest.php <?php $a = $_GET["a"]; if(isset($_GET["a"])){ echo "\$GETに[".$_GET["a"]."]が入っています。<br>"; } if(isset($a)){ echo "\$aに[".$a."]が入っています。<br>"; } if(!isset($_GET["a"])){ echo "\$GETは空です。<br>"; } if(!isset($a)){ echo "\$aは空です。<br>"; } ?> ./issettest.php と実行すると、 $GETの値は空です。 $aの値は空です。 ./issettest.php?a=test と実行すると $GETに[test]が入っています。 $aに[test]が入っています。 ./issettest.php?a= と実行すると $GETに[]が入っています。 $aに[]が入っています。 となります。 これがissetの正常な動作なのでしょうか? 例えば、入力フォームを使いGETやPOSTでの値を送信する場合、入力フォームに値が入力されたかどうかを判定するにはissetは使えないのでしょうか? わかりづらい質問で申し訳ありませんが、先輩方の回答お待ちしています。 質問に不備などありましたらご指摘下さい。

    • ベストアンサー
    • PHP
  • sessionの使い方

    詳しい方がいましたら、ご教授下さいませ。 ---a.php--- <?php if(!isset($_SESSION['n']) {  session_start();  $_SESSION['n']='1'; } ?> ---------- ---b.php--- <?php session_start(); $_SESSION['n']='2'; ?> ---------- ---c.php--- <?php session_start(); echo($_SESSION['n']); ?> ---------- a.phpで、'1'をセットして保持し、 b.phpが動作したとき、'2'に入れ替えているのですが、 c.phpで確認すると、何故か'1'のままです。 一度セットした値を、入れ替えることって出来ないのでしょうか?

    • ベストアンサー
    • PHP
  • $a++と++$aの違いについて

    $a=0; if($a++){ print "真です\n"; }else{ print "偽です\n"; } は、結果が「偽です」として出力されます。 $a=0; if(++$a){ print "真です\n"; }else{ print "偽です\n"; } は結果が「真です」と表示されます。 この上記二つの違いは、++が前につくか、後ろにつくかの違いのようなのですが、そもそも、 if($a++)とif(++$a)とは何を意味しているのでしょうか。 $aはゼロですが、$a++は何なんでしょう? まったくイメージできなくて、さっぱりといった感じで悩んでいます。 宜しくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう