電子書籍の厳選無料作品が豊富!

phpで会員制サイトの制作を勉強しています。
データベースへはPDOで接続しています。
MySQLデータベースを使用しています。

現在、クラスを作成してみようとオブジェクト指向について学習しています。

試しに、既に作ってあった、POSTされた文字列をhtmlspecialcharsやfilter_inputするようなセキュリティやNoticeエラー対策に使うプログラム関数を
class Checkのメソッドとしてまとめようとしています。

関数にしていたときは正常に動いたのですが、
クラスのメソッドにするとFatal error: Cannot use object of type Check as array in ~というエラーが出てしまいます。
恐らく、引数の受け渡し($_POSTの値の受け渡し)の時点でうまくいっていないのか、
私的には、メソッド結果の受け取りがあまり理解できていないので、
メソッド結果の値を配列で返すのがうまくいっていないのだと思います。

<関数>
function postFilter($before)
{
foreach($before as $key=>$value)
{
$after[$key] = filter_input(INPUT_POST, $key);
}
return @$after;
}

*呼び出し*
$post = postFilter($_POST);
$email = $post["email "];

<クラス>
class Check {

public function エスケープ処理 {
エスケープ処理のメソッド
}

//POSTで受け取ったものをfilter_inputでフィルタリング
public function filterPost($before){
foreach($before as $key=>$value)
{
$after[$key] = filter_input(INPUT_POST, $key);
}
return $after;
}
   ・
   ・
   ・
}

*呼び出し*
$post = new Check();
$post -> filterPost($_POST);
$email = $post ["email "];

そもそもクラス化する必要がない気がして、関数のままにしておこうかと思ったのですが、
オブジェクト指向はどのプログラムを学ぶにあたっても、重要だと思い、
わからないまま放置したくないので質問しました。


添削いただけませんでしょうか?
よろしくお願いします。

A 回答 (3件)

コーディングミスについては既に指摘があるので…



・htmlspecialcharsに関しては(Smartyなどのテンプレートエンジンを使わない限り)非常に使用頻度が高く、尚且つ「あらかじめエスケープしておく」というのは対策方法として誤っているため、関数「h」のように名称の短い関数として定義しておくことをおすすめします。何度も「HTML::escape」とか「$html->escape」とか書くのはかなり面倒だと思います。

・filter_inputに関しては、この書き方だと受け取っていないものが未定義のままになってしまうため、実際に送られてくるかどうかは別として、正しいリクエストなら受け取る予定であるキーをあらかじめサーバ側で決めておく必要があります。また、filter_inputは万能ではなく、配列形式のパラメータを処理するのが不得意です。(フレームワーク等を使わない限り)自前でそれなりのコードを書かなければなりません。以下のふたつの関数はクラスメソッドにしておくのもいいと思います。

filter_input_simple
http://qiita.com/mpyw/items/5a7242269f51dfabc973

filter_input_array_recursive
http://qiita.com/mpyw/items/c39b9ee695a5c2e74627

これらの関数を使って配列構造のバリデーションが終わった後は、1つずつif文を書くなりforeachを使うなりお好きにどうぞ。

フレームワークの使用例を読んでみるのも勉強になるかもしれません。

Symfony - 第2章 - フォームのバリデーション
http://symfony.com/legacy/doc/forms/1_2/ja/02-Fo …

「こんな風に使えたら便利だな」とか考えながら自分で似たインターフェースを持つクラスを作っていくといろいろ捗ると思います。
    • good
    • 0
この回答へのお礼

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

確かに使用頻度の高い関数の関数名は短くするべきですね。
また、filter_inputのご指摘とフレームワーク学習のお勧めありがとうございます。
参考URL、大変助かります!

お礼日時:2014/12/03 21:35

質問に関係ないところだけどこのクラスってインスタンス作る必要あるのか?


staticメソッドで十分な機能だろ。
    • good
    • 0
この回答へのお礼

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

>質問に関係ないところだけどこのクラスってインスタンス作る必要あるのか?
>staticメソッドで十分な機能だろ。

はい。確かに仰るとおりですね。

ご指摘ありがとうございました!

お礼日時:2014/12/03 21:38

オブジェクトを配列として扱っちゃだめ、と書いてあります。



どこを直せばいいかわかるので、エラーは読めるようになりましょう。

とりあえずエラーをなくすには

$filtered = $post -> filterPost($_POST); // ここで処理したものを戻り値として変数に持たないといけない。
$email = $filtered ["email "];

とすればいいと思います。

クラスの参考url
http://qiita.com/mpyw/items/41230bec5c02142ae691
    • good
    • 0
この回答へのお礼

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

エラーは一応読めたのですが、オブジェクトを配列として扱ってはいけないというところがいまいちわかっていませんでした。
コードのご指摘と参考URLありがとうございます。

お礼日時:2014/12/03 21:36

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