こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

string(0) ""判定 php

・string(0) ""判定は、どう書くのでしょうか?
・if(変数===""){
・それともempty?

投稿日時 - 2013-11-15 23:58:36

QNo.8348943

暇なときに回答ください

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

まず empty() に関してですが、これは isset() の拡張です。

empty($var) = !isset($var) || !$var

が成り立ちます。つまり変数が定義済みと確定している場合は empty() を用いるまでもなく、単に変数を否定してブール変換するだけでいいんですよね。CakePHPのコアコードでさえもこれを理解していない人が書いていてバンバン empty() 使われていたりするんですが・・・(苦笑

基本的に !$str は文字列の '0' もTrueとしてしまうので使うことはあまりないですね。配列において、配列が空かどうかチェックするときに !$arr とすることはありますが、 !$str はないと思います。よって文字列として定義済みの変数の内容チェックを行う場合は

$str === ''

が基本となるでしょう。但し、

$_POST['str'] === ''

だとダメなので注意。このケースでは本来は isset() で未定義かどうかのチェックを行うべきであるが、それをスキップして (E_NOTICE を無視して)NULLとして初期化される場合も考慮する場合は

$_POST['str'] == ''

でないといけません。isset() を用いてチェックを行う場合は

!isset($_POST['str']) || $_POST['str'] === ''

ですね。悪意のあるユーザーが配列としてPOSTしてくる可能性も考慮した理想的なコードを書くならば、

!isset($_POST['str']) || !is_string($_POST['str']) || $_POST['str'] === ''

となります。私はいつもこれで書いてます。(さすがに毎回自前で書くのは面倒なので http://qiita.com/mpyw/items/c39b9ee695a5c2e74627 を活用していますが)

なお、「文字列変数 === ''」「文字列変数 == ''」の結果は等しいと思いますが、前者の方が高速なので基本的にはそちらを採用すべきでしょう。

投稿日時 - 2013-11-16 12:36:10

お礼

回答ありがとうございました。
参考になりましたー

投稿日時 - 2013-12-18 06:50:33

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>>To_aru_Userさん
> CakePHPのコアコードでさえもこれを理解していない人が書いていてバンバン empty() 使われていたりするんですが・・・(苦笑

理解してないのはTo_aru_Userさんのほうかもしれません(苦笑
例えばModel::find系のメソッドで該当がなかった場合の戻り値が、今までに2通りありました(falseか空array)。

$users = $this->User->find('all', $query);
if ( $users !== false ) {
/* 処理 */
}

なんて書いてて、Cakeのバージョンあげたら空arrayが返却された・・なんてなればコードはたちまち破綻するでしょう。
Model::findの戻り値の評価としては取得できたか出来ないかが重要なので、===ではなくemptyで書いておくべきだと私は思います。

> ・string(0) ""判定は、どう書くのでしょうか?

ケースバイケースになるでしょう。
if ( empty($hoge) ) {
}
でtrueになるケースは''とNULLと0とarray()とfalseです。
これらを厳密に区別する必要があるなら===を使いましょう。

投稿日時 - 2013-12-11 18:20:40

お礼

回答ありがとうございましたー

投稿日時 - 2013-12-18 06:51:12