1

次のスクリプトが機能しないのはなぜですか?

$arr = array();

function collect( $array , $val) {
    $array[] = $val;
    return $array;
}

function checkFoo( $s ) {

    $valid = true;

    if ( strlen( $s ) === 0 ) {
        $isValid = false;
        collectFoo( $arr , $s );
    }

    return $valid;
}

function checkBar( $t ) {

    $valid = true;

    if ( strlen( $s ) != 10 ) {
        $isValid = false;
        collectFoo( $arr , $t );
    }

    return $valid;
}

if ( checkFoo( $that ) && checkBar( $this ) ) {

    echo "success"; 

} else {

    print_r( $error );

}

私はいつも得ます

Notice: Undefined variable: error in /my.php on line 12

collect(...)ここで、12行目は; の2番目の出現に似ています。

関数が返すことができる値は1つだけですが、関数が何かを返す関数で何かを返す場合はどうなりますか?内部にcollect戻るので、それは。を返します。$arraycheckBar$valid

4

3 に答える 3

1

グローバル変数($ arr)を使用しているので、そのように宣言する必要があります。例:

function checkFoo( $s ) {
    global $arr; // declare $arr to be usable inside this function scope
    $valid = true;

    if ( strlen( $s ) === 0 ) {
        $isValid = false;
        collectFoo( $arr , $s );
    }

    return $valid;
}
于 2013-02-15T22:49:46.640 に答える
0

編集済み

あなたのコードは完全に間違っているので、もっと練習が必要です!コードのこの部分を変更する必要があります:

$arr = array();

function collectFoo( $arr , $val) {
    global $arr;

    $arr[] = $val;
}

function checkFoo( $s ) {
    global $arr;

    $valid = false;
    if ( strlen( $s ) === 0 ) {
        $valid = false;
        collectFoo( $arr , $s );
    }
    return $valid;
}

function checkBar( $t ) {
    global $arr;

    $valid = true;
    if ( strlen( $t ) != 10 ) {
        $valid = false;
        collectFoo( $arr , $t );
    }
    return $valid;
}

$a = checkFoo( $that );
$b = checkBar( $this );
if ( $a && $b ) {
    echo 'Success !';
} else {
    print_r( $err );
}
于 2013-02-15T23:02:50.237 に答える
0

$arr変数を使用する関数内で、変数をグローバルとして宣言していません。あなたはここでそれについてのいくつかの情報を見つけることができます。

また、実際にの戻り値を使用しているようには見えないcollectので、問題は、checkBarまたはcheckFooがfalseを返していることです。これにより、初期化されていない変数を使用してprint_r関数にフォールスルーします。 $error

最後に、参照によって変数を渡していないため、collect関数は実際には変数に対して何もしていないように見えます。ここで参照することにより、変数の受け渡しについて調べることができます。これについてのSOの質問もここにあります$arrcollect

于 2013-02-15T23:04:06.197 に答える