dポイントプレゼントキャンペーン実施中!

PHP Version 5.1.6 です。

以下のようなクラスを書いていたのですが、


//-----------------------------------------------------------
class PreventAttack{

        public static function TopStaticMethod(){
            self::ExcludeNullbyte();
        }
        
        private static function ExcludeNullbyte(){
            $_GET = self::ExcludeNullbyte_Exec( $_GET );
            $_POST = self::ExcludeNullbyte_Exec( $_POST );
            $_COOKIE = self::ExcludeNullbyte_Exec( $_COOKIE );
            return;
        
        }

            private static function ExcludeNullbyte_Exec($param){
             if ( is_array( $param ) ) {
             return array_map('ExcludeNullbyte_Exec', $param );
             }
             return str_replace( "\0", "", $param );
            }
}
//-----------------------------------------------------------

Warning: array_map() [function.array-map]: The first argument, 'ExcludeNullbyte_Exec', should be either NULL or a valid callback in /var/www/(中略)include/class/PreventAttack.class on line 39

と怒られてしまいました。
39行目は、下から5行目のarray_mapのところです。

で、このエラーメッセージでグーグルで検索して、いろいろたどっていったら、

http://jp.php.net/manual/ja/language.pseudo-type …

にたどりつき、

このページのユーザコメント欄に、

//-----------------------------------------------------------
To recap mr dot lilov at gmail dot com's comment: If you want to pass a function as an argument to another function, for example "array_map", do this:

regular functions:
<?
array_map(intval, $array)
?>

static functions in a class:
<?
array_map(array('MyClass', 'MyFunction'), $array)
?>

functions from an object:
<?
array_map(array($this, 'MyFunction'), $array)
?>

I hope this clarifies things a little bit
//-----------------------------------------------------------

と書いてあったので、

return array_map(array('ExcludeNullbyte_Exec', $param );
のところを、
return array_map(array('PreventAttack','ExcludeNullbyte_Exec'), $param );

に変えたら、エラーがなくなりました。

・・・が、その理屈がいまいちわかりません。

どなたかおわかりの方がいらっしゃいましたら、お教えいただけないでしょうか?

よろしくお願いいたします。

A 回答 (1件)

あなたが見つけたページにちゃんと書いてあるようですけど?



http://jp.php.net/manual/ja/language.pseudo-type …
より引用。
| オブジェクトのインスタンスを渡すための方法の 1 つは、 オブジェクトを 0 番目の要素、
| メソッド名を 1 番目の要素として含む配列を渡すことです。
| 静的なクラスメソッドの場合、 0 番目の要素としてオブジェクトを渡す代わりにクラス名を渡すことにより、
| オブジェクトのインスタンスを作成せずに渡すことができます。

コールバック関数が静的クラスメソッドならそのような書き方をすべしとちゃんと書かれてます。
(そのすぐ下に例まで載ってます。)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

すみません、見逃してしまいました。

やっと理解しました。

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

お礼日時:2008/08/20 21:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!