2

isset() と empty() を関数にカプセル化しようとしています。

私のホーム開発サーバー(WinXPのApache 2.4.3、PHP 5.2.17)では問題なく動作しました。Fedora を実行している大学の Linux マシンに移植したところ、未定義のインデックスに関する通知がありました。

自宅のコンピューターで php.ini を確認したところ、エラー報告がすべてに設定されていました。error_reporting(E_ALL); を入れました。私のPHPスクリプトでエラーを複製してみてください。それは起こりませんでした。

質問 1: ホーム開発用コンピューターで通知が届かないのはなぜですか?

これが私の機能です:

<?php
function there($s) {
    if (! isset($s)) {
        return false;
        }
    if (empty($s)) {
        return false;
        }
    return true;
}
?>

ここでは、セッション変数が存在するかどうかをテストします。

if (! there($_SESSION['u'])) {
    $_SESSION['u'] = new User();
    }

関数を切り替えて、 isset() をテストする前に empty() をテストするようにしました。私はまだ学校でこれをテストする機会がありませんでした。

質問 2: 変数が未定義の場合、または設定されていない場合、empty() は一般に通知を回避しますか?

質問 3: there() 関数を使用してこれを行うことはできますか? それとも、未定義または未設定のパラメーターを渡すだけで通知を受け取ることができますか?

4

4 に答える 4

3

issetemptyは関数ではなく、言語構造です。そのため、値にアクセスしようとする代わりに、リテラル変数名を読み取るなどのことを回避できます。あなたが定義する関数はそれを行うことはできません。

それを念頭に置いて、両方をテストする必要はありません。emptyは のスーパーセットなissetので、実際にチェックする必要があるのは だけですempty

于 2013-03-05T17:27:48.157 に答える
2

あなたの関数は次のものとほぼ同等です!empty:

if (empty($_SESSION['u'])) {
    $_SESSION['u'] = new User();
}

唯一の違いは、存在しない変数が渡された場合、ラッパー関数は文句を言いますが、言語構造 emptyはそうではありません (どちらもそうしませんisset)。

サブ質問

ホーム開発用コンピューターで通知が届かないのはなぜですか?

おそらく、エラー報告がオフになっているためです。

empty() は一般に、変数が未定義の場合、または設定されていない場合に通知を回避しますか?

はい。

there() 関数を使用してこれを行うことはできますか? それとも、未定義または未設定のパラメーターを渡すだけで通知を受け取ることができますか?

未定義の変数に関する通知が表示されます。

于 2013-03-05T17:28:20.813 に答える
0

@Kolink の素晴らしい返信を本当に証明する方法として、私が気付いていなかった何か...

echo '<form action="" method=POST>
<input type=text value="" name="string" />
<input type=text value=0 name="int" />
<input type=submit />
</form>';

if( empty($_POST['string'] ) ){ 
var_dump( $_POST['string']) ;
}
if( empty($_POST['int'] ) ){ 
var_dump( $_POST['int']) ;
}
if( empty($_POST['something'] ) ){ 
echo 'something was not set, but you cannot var_dump it without a warning';
}
于 2013-03-05T18:16:03.697 に答える