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 "];
そもそもクラス化する必要がない気がして、関数のままにしておこうかと思ったのですが、
オブジェクト指向はどのプログラムを学ぶにあたっても、重要だと思い、
わからないまま放置したくないので質問しました。
添削いただけませんでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
コーディングミスについては既に指摘があるので…
・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 …
「こんな風に使えたら便利だな」とか考えながら自分で似たインターフェースを持つクラスを作っていくといろいろ捗ると思います。
ご回答ありがとうございます。
確かに使用頻度の高い関数の関数名は短くするべきですね。
また、filter_inputのご指摘とフレームワーク学習のお勧めありがとうございます。
参考URL、大変助かります!
No.3
- 回答日時:
質問に関係ないところだけどこのクラスってインスタンス作る必要あるのか?
staticメソッドで十分な機能だろ。
ご回答ありがとうございます。
>質問に関係ないところだけどこのクラスってインスタンス作る必要あるのか?
>staticメソッドで十分な機能だろ。
はい。確かに仰るとおりですね。
ご指摘ありがとうございました!
No.1
- 回答日時:
オブジェクトを配列として扱っちゃだめ、と書いてあります。
どこを直せばいいかわかるので、エラーは読めるようになりましょう。
とりあえずエラーをなくすには
$filtered = $post -> filterPost($_POST); // ここで処理したものを戻り値として変数に持たないといけない。
$email = $filtered ["email "];
とすればいいと思います。
クラスの参考url
http://qiita.com/mpyw/items/41230bec5c02142ae691
ご回答ありがとうございます。
エラーは一応読めたのですが、オブジェクトを配列として扱ってはいけないというところがいまいちわかっていませんでした。
コードのご指摘と参考URLありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
クラス設計の良い参考書を教え...
-
配列とオブジェクトの違い
-
クラス内でメソッド呼ぶ際、thi...
-
phpのクラスにて別ファイルの変...
-
ユーザ定義関数にデフォルト引...
-
phpで使用不可のクラス名
-
スクリプト言語特有のテクニック
-
正規表現について
-
phpのクラスについて
-
'_'(アンダースコア)の使い方...
-
PHPのif文でその処理を途中で抜...
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
【file_exists】ファイルが存在...
-
バッチを用いたフォルダの自動移動
-
現在位置より2つ上のディレク...
-
$_SESSION 有効期限をブラウザ...
-
.phpと.incファイルの違いはな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
class定義のphpをファイル分割...
-
PHPの名前空間について質問です。
-
配列とオブジェクトの違い
-
phpのクラスにて別ファイルの変...
-
PHP4、PHP5 1ファイル複数クラ...
-
文字連結中の三項演算子について
-
PHP5 コンストラクタや初期化の...
-
プログラムにも慣例みたいなも...
-
(クラス関連)staticキーワー...
-
phpで使用不可のクラス名
-
phpにおける初期化の意味
-
PHPでサブクラスからスーパクラ...
-
クラス
-
[CakePHP2.2] :: の意味と役割
-
phpで時間を増やしていくにはど...
-
PHPでオブジェクト指向開発して...
-
$this->pets[$i]->report();の...
-
ソースファイルの分け方について
おすすめ情報