アプリ版:「スタンプのみでお礼する」機能のリリースについて

まとめてサニタイズする方法として下記のように書いてみました。
引数が配列でなければ問題ないのですが、配列だとこんなエラーが出ます。

Warning: array_map() expects parameter 1 to be a valid callback, function 'sanitize' not found or invalid function name in ファイル名

foreachでまわすのも考えましたが、できるならスマートにと思っているのですが
どうすれば再帰的な処理ができるでしょうか?

$valid = new Valid();

$array = array(
'あああ','いいい','ううう',
);

$valid->sanitize( $array );

class Valid{
public function sanitize( $str ){
if ( is_array( $str ) ) return array_map( 'sanitize', $str );
return str_replace( "\0", '', $str );
}
}

A 回答 (2件)

オブジェクト内のメソッドを動的に指定するcallableは



array($this, 'sanitize')

です。
また、クラス内のメソッドを静的に指定するcallableは

array(__CLASS__, 'sanitize')

です。PHP5.3以降では

'Valid::sanitize'

のように書くことも出来ます。

なお、配列再帰処理でしたらarray_walk_recursiveを使うのが一番速いですよ。
http://php.net/manual/ja/function.array-walk-rec …

(5.3以降のみのクロージャを使用しています)

class Valid {
____
____public static function sanitize($input) {
________if (is_array($input)) {
____________array_walk_recursive($input, function(&$v) {
________________$v = str_replace("\0", '', $v);
____________});
________} else {
____________$input = str_replace("\0", '', $input);
________}
________return $input;
____}
____
}

(この指摘をすると質問の前提条件自体が崩れると思いますが)
そもそもNULLバイトを削除したところで安全対策になるかどうかというと疑問です。
現在のPHPの多くの関数はバイナリセーフなのでNULLバイトを含んでいても正しく処理できます。
それよりもUTF-8エンコーディングバリデーションの方が必要な気がします。

私はこんな感じで、リクエストを処理する部分にエンコーディングバリデーションも組み込んでいますね。
http://qiita.com/mpyw/items/c39b9ee695a5c2e74627

【preg_match関数でパターンにu修飾子をつけたとき】
不正エンコーディングが見つかった際、返り値は必ずFALSEになります

【preg_replace関数でパターンにu修飾子をつけたとき】
不正エンコーディングが見つかった際、返り値は必ずNULLになります
    • good
    • 0
この回答へのお礼

わかりやすい回答をありがとうございました。
5.2のサーバーなので以下のようにして動作させることができました。

if ( is_array( $value ) ) return array_map( array( $this, 'sanitize' ), $value );

NULLバイト削除以下は略しましたが文字コードの設定やスペースの削除など一通りの処理を行っています。

qiitaのソースも是非参考にさせていただきます!

お礼日時:2013/10/06 10:56

sanitizeは普通の関数じゃなくて、メソッドなので、オブジェクトに対して -> 経由での呼び出ししか出来ません。

つまり、array_map の引数に渡せません。

Validというクラスで何をしたいのかいまいちわかりません。クラスとオブジェクトについて、よく理解されてないのではないかと思います。

とりあえず動くようにすると、

$valid = new Valid();
$array = array(
"ああ\0あ","いいい","ううう",
);

debug_zval_dump($array);
$array = $valid->sanitize( $array );
debug_zval_dump($array);

class Valid{
public function sanitize($str){
return Valid::sanitizesub($str);
}
public static function sanitizesub( $str ){
if ( is_array( $str ) ) return array_map( "Valid::sanitizesub", $str );
return str_replace( "\0", '', $str );
}
}
    • good
    • 0

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