エラーチェックの自作クラスを作っているのですが効率のいいロジックを教えてください。

現状は以下のような状態です。

class FORM {
function hoge($str) {
// 任意の条件によるエラーチェックを行いエラーであればtrueを返す
}
// 以下思いつくようなエラーチェックをひたすら書いてます。
}

if (POSTされたら) {
$form = new FORM();
if ($form->hoge($_POST['name'])) {
// エラーフラグ
$err['name'] = true;
}
// 以下同様にチェックが必要な分だけ記述
}
}

動作は正常にしておりチェックの度に正規表現等を書かなくても済むのでべた書きよりは
だいぶスッキリできているのですがチェックがあるものをそれぞれ書かなければ
行数自体にはさほど差がありません。

いい方法と言えど人それぞれかと思うのですが効率よくクラスを使用するには
どのようなロジックが考えられるでしょうか?

エラーメッセージの出力等可能な事はできるだけクラス内で処理したいと考えております。

一連の流れやアドバイス等でも構いませんので有識者の方宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

開示されている情報だけで何をどこまでチェックしたいか分かりませんが、


空かどうかのチェックも他のチェックも「//お好みのエラーチェック」のところに全て入れておくだけです。

case "url":
if (is_null(trim($str))) return false;
return (記載内容チェック)? true:false;
break;

//年齢が必須項目(20歳以上),emptyとis_numeric
case "age":
if (is_null(trim($str))) return false;//emptyならfalse
if (!is_numeric($str)) retuen false;//数値以外ならfalse
return ($str >=20 )?true:false; // 20未満ならfalse
break;
以上のように必要なチェックを羅列していくだけです。
$strが配列でも配列に応じたチェックを列挙するだけです

dcx147さんの元の質問での例示が、booleanでの戻り値を期待した記載になっていたので回答も合わせていますが、エラー内容に応じたエラーコードを戻り値にするようにしておくともっと使いやすいクラスになるでしょうね。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。なるほど!1つの定義で1つのチェックではなく必要に応じて
それぞれのチェックをパターン化してしまえばいいという事ですね。勘違いしておりました^^;

>エラー内容に応じたエラーコードを戻り値にするようにしておくともっと使いやすいクラスになるでしょうね。

とりあえずとっついてみた形での記述となっているので確かに今後改良の余地は十分にありですね。。。

もし宜しければどのような記述例にすれば効率があがるものか概要だけでも教えて頂けますと
非常に今後の参考になるのですが宜しければお願い致します!

お礼日時:2009/06/01 11:06

>> 上記のように複数回のエラーチェックや1つの内容で複数の項目がある場合



呼び出し側を
if ($form->hoge($key, $_POST[$val])) {
にして

class FORM {
function hoge($key,$str) {
switch ($key) {
case "name":
//お好みのエラーチェック
break;
case "jusho":
//お好みのエラーチェック
break;
case "url":
//お好みのエラーチェック
break;
case "mail":
//お好みのエラーチェック
break;
//あとは好きなだけ追加
}
}
}

この回答への補足

お返事ありがとうございます!
補足をお願いしたいのですが見た感じですとswitch文なので例えばurlが必須の場合は

if ($form->hoge('empty', $_POST[$val])) {
// 空エラー
}

if ($form->hoge('url', $_POST[$val])) {
// 形式エラー
}

のように2回なしにチェックの分だけ書かなければいけないように見えるのですが
そういう事でしょうか?

補足日時:2009/05/30 14:12
    • good
    • 0

チェックするキーを配列で準備しておき、ループ処理というのは如何でしょう



if (POSTされたら) {
$keys=array("name","jusho","url","mail");//チェックする項目を羅列
$form = new FORM();
foreach($keys as $key=>$val){
if ($form->hoge($_POST[$val])) {
// エラーフラグ
$err[$val] = true;
}
}
}
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
確かにこうすれば簡略化も可能ですね!しかし疑問があるのですが
例えば年齢が必須項目(20歳以上)の場合普通であればemptyとis_numericと
比較演算子の合計3回はチェックを掛ける必要があり電話番号が必須項目で
-(ハイフン)を挟み3つの項目になっている場合などがあると思うのですがその場合は
クラスでどのような処理を書けばいいものでしょうか?

現状のように1つの項目で1つのエラーチェックを行う分には問題ないのですが
上記のように複数回のエラーチェックや1つの内容で複数の項目がある場合
または配列の場合等入り組んでいる場合どのように処理すればいいものかが
具体的にわからない状態です。

お礼日時:2009/05/29 10:39

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q自クラスをnewしたインスタンスの参照

また、よろしくおねがいします。
あるインスンタンス(A)から別のクラスをnewしてインスタンス(B)を作成し

class A{
public A(){}
B b = new B();
public hoge(){
System.out.plintln("hoge");
}
}

class B{
public B(){}
A.hoge(); <<= ここから自クラスをnewしたAのhoge()を起動させたい
}

こんな風にnewされたB側からAのメソッドを動かしたいなんて場合は、どのようにするんでしょうか?

Aベストアンサー

もう一つ別の方法として、class Bをclass Aの内部クラスにしてしまうという方法があります。

class A {
class B {
public B() {}
void x() {
A.this.hoge(); // 内部クラスBのインスタンスからAのインスタンスメソッドを呼ぶ書き方
}
}
Aの実装以下略
}

Qforeach($stock as $name => $value){ の$value)で値用の変数

<!DOCTYPE html>
<html>
<head>
<title>P161 Sample6-7 array()を使う</title>
</head>
<body>

<?php

$stock = array("みかん"=>80,"いちご"=>60,"りんご"=>22, "もも"=>50,"くり"=>57);

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>番号</th>
<th>個数</th>
</tr>

<?php

foreach($stock as $name => $value){
print "<tr><td>{$name}</td><td>{$value}個</td></tr>\n";
}

?>

</table>

</body>
</html>
以上の foreach($stock as $name => $value){ 
 のforeach文は特殊な繰り返し文で$stockは”変数名”・$name"はキー(引出し)用の変数・
 ここまでは何となく意味がわかります。最後のは$valueは”値用の変数”・・とあります。
 ここで言う、”値用の変数”の値とは何のことなのでしょうか? 
 よろしくお願いいたします。

<!DOCTYPE html>
<html>
<head>
<title>P161 Sample6-7 array()を使う</title>
</head>
<body>

<?php

$stock = array("みかん"=>80,"いちご"=>60,"りんご"=>22, "もも"=>50,"くり"=>57);

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>番号</th>
<th>個数</th>
</tr>

<?php

foreach($stock as $name => $value){
print "<tr><td>{$name}</td><td>{$value}個</td></tr>\n";
}

?>

</table>

</body>
</html>
以上の foreach($stock as $name => $value){ 
 のfor...続きを読む

Aベストアンサー

$name には、"みかん"、"いちご" など。$valueには、80や60が入ります。

> $stock = array("みかん"=>80,"いちご"=>60,"りんご"=>22, "もも"=>50,"くり"=>57);

の => という記号と対応しているでしょ?

Q基本クラスポインタ = new 派生クラス[i];

基本クラスのポインタ変数pbaseを宣言し、new演算子にて派生クラスの配列を動的に確保して、pbaseに代入した場合、delete[] pbaseは上手く動作するのでしょうか。
(Aのデストラクタは仮想関数にしてあるとしておきます)

------ex-start------
class A {};
class b:public A{};

main()
{
  A * pbase
  pbase = new B[5];
  delete[] pbase
}
------ex-end------

例えば、
class Aは12バイト
class Bは20バイト
である場合、配列のサイズが違うのに、delete[]でちゃんと開放されるのでしょうか。
それともnew/deleteは確保したサイズをシンボル毎に記憶しているのでしょうか。
どうもこの辺が曖昧で実装する時にあやふやになってしまいます。どなたかお知恵をお貸しくださいませ。

Aベストアンサー

struct A { int x; virtual ~A() { cout << "~A: " << this << endl; } };
struct B: A { int y; ~B() { cout << "~B: " << this << endl; } };
B *b = new B[5];
A *a = b;
A *a2= a + 2;
a2->x = 1;
delete[] a;
これを素朴に考えると a2 は単純に a に 2 * sizeof(A) バイト足した場所(b[1] と b[2] の中間ぐらい?)を指すかもしれないです。a2->x = 1 は危険な感じがします。
delete [] が、配列の各要素のデストラクタに渡す this を求めるときに同様の失敗をするかもしれないです。

…と今日まで思っていましたが、実際やってみると delete[] で new B[5] が削除できてしまいました(VC++6.0)。不思議です。

Qprint "{$data[$i][$j]}";の $dataと「直接関係」がある

<!DOCTYPE html>
<html>
<head>
<title>P185 Sample6-15▸ 多次元配列</title>
</head>
<body>

<?php

$data[0][0] = "東京";
$data[0][1] = 32;//$data[0][●]に東京のデータを格納します。
$data[0][2] = 25;
$data[1][0] = "名古屋";
$data[1][1] = 28;//$data[1][●]に名古屋のデータを格納します。
$data[1][2] = 21;
$data[2][0] = "大阪";
$data[2][1] = 27;//$data[2][●]に大阪のデータを格納します。
$data[2][2] = 20;
$data[3][0] = "京都";
$data[3][1] = 26;//$data[3][●]に京都のデータを格納します。
$data[3][2] = 19;
$data[4][0] = "福岡";
$data[4][1] = 27;//$data[4][●]に福岡のデータを格納します。
$data[4][2] = 22;

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>都市名</th>
<th>最高気温</th>
<th>最低気温</th>
</tr>

<?php

for($i=0; $i<count($data); $i++){
print "<tr>";
for($j=0; $j<count($data[0]); $j++){
print "<td>{$data[$i][$j]}</td>";//配列の要素を出力する。
}
print "</tr>\n";
}

?>

</table>

</body>
</html>
以上ですが・・・だんだん難しくなってきました!
 さて
  print "<td>{$data[$i][$j]}</td>";の $dataと「直接関係」があるところは
 1) for($j=0; $j<count($data[0]); $j++){  
 2)$data[0][0] = "東京";~$data[4][2] = 22;
  の1)2)のどちらと「直接関係」があるのでしょうか?
 以上よろしくお願いいたします。

<!DOCTYPE html>
<html>
<head>
<title>P185 Sample6-15▸ 多次元配列</title>
</head>
<body>

<?php

$data[0][0] = "東京";
$data[0][1] = 32;//$data[0][●]に東京のデータを格納します。
$data[0][2] = 25;
$data[1][0] = "名古屋";
$data[1][1] = 28;//$data[1][●]に名古屋のデータを格納します。
$data[1][2] = 21;
$data[2][0] = "大阪";
$data[2][1] = 27;//$data[2][●]に大阪のデータを格納します。
$data[2][2] = 20;
$data[3][0] = "京都";
$data[3][1] = 26;//$data[3][●]に京都の...続きを読む

Aベストアンサー

> の1)2)のどちらと「直接関係」があるのでしょうか?

No.1さんと同じく質問の意味が理解できません。
わかり易く補足いただいた方が良いかと思います。



”の1)2)のどちらと「関係」があるのでしょうか?” というご質問であれば

”どちらとも関係あります” という回答になります。

Qクラスの参照(同じファイル内 vs 別々のファイルの場合)

二つの.javaファイルがあります。
<ABC.java>
class ABC {
public static void main(String args[]) {
A obj = new A();
obj.hello();
}
}
---------------------------------------------

<A.java>
class A{
void hello() {
System.out.println("Hello from A");
}
}
---------------------------------------------
ABC.javaファイルでコンパイルすると、「 シンボルを解釈処理できません。」というエラーメッセージが出ます。でも、ABC.javaファイルの中に、class Aを続けて書くとコンパイルできます。なぜ、別々のファイルにすると参照できないのでしょうか?
(おなじフォルダ内に入れています)
教えてください。よろしくお願いします。

二つの.javaファイルがあります。
<ABC.java>
class ABC {
public static void main(String args[]) {
A obj = new A();
obj.hello();
}
}
---------------------------------------------

<A.java>
class A{
void hello() {
System.out.println("Hello from A");
}
}
---------------------------------------------
ABC.javaファイルでコンパイルすると、「 シンボルを解釈処理できません。」というエラーメッセージが出ます。でも、ABC.javaファイルの中に、class A...続きを読む

Aベストアンサー

おはようございます。

質問内容と、他の方の解答の補足の書き込みをみて
思ったのですが、ソースファイルとクラスファイル
を勘違いしてませんでしょうか?もしかしたら、
必要以上に解答内容が大きくなってしまって混乱
してるのかな?

実際解答としては「No#1」の方の内容で十分です。

簡単に説明しますと…
2つのクラスを同一Javaファイルに書いてコンパイル
すると、両方のクラスのクラスファイルが生成されます。
しかし2つのクラスを別々のファイルに書くと,当たり前
ですが、それぞれのクラスファイルしか生成されません。

質問内容のテストプログラムでは、Aクラスを記述している
ファイルをコンパイルしないで、ABCファイルをコンパイル
したのではないですか?それなら、Aクラスが存在していな
いのですから、コンパイラもわからないので「シンボルを
解釈処理できない」というエラーを出してしまいます。

ちょっと長くなってしまいましたね^^;

Q$str=preg_replace('/\u3000/','  ',$str);

によってutf-8の空白文字をhtmlの空白文字に変換しようとしたのですがエラーになります
どうしたらいいのでしょうか?

Aベストアンサー

>そもそも?のところにコード表現で空白文字を入力する手段はないのでしょうか?
\xE3\x80\x80
で一応いいかと思いますが…

Qnew クラス名(Activity名.this);

Android

・下記のようなコードがあるのですが、このとき「.this」の意味を教えてください
・Activityクラス自身?
・「.」で繋いでいる意味も、「this」の意味も良く分かりません
・thisだけでは駄目?
・引数は1つ?

public class Hoge extends Activity {

 public class C1 {//インナークラス?

  protected m1method(略) {
  略 = new クラス名(Hoge.this);

Aベストアンサー

このソースはHogeクラスの中に新しくC1クラスを定義しているのでC1はHogeクラスの
インナークラスで間違いなく Hode.C1 と「.」でつないで表記します。

このときのHoge.thisとは、Hoge.C1クラスのオブジェクト自身のことです。例えば、
tmp = new Hoge.C1(); とした場合は tmp に該当します。

また、最後の行は、自分自身をパラメータとして「クラス名」のオブジェクトを生成
していますので、引数の数はそのクラスによります。

試してないので不確かですが、thisだけだとHogeクラスのオブジェクトと間違う
可能性がありますので、Hoge.thisのほうが確実です。

Qphpで$chars{$num};とした場合の扱い

いつもお世話になっております。

下記のページのパスワードを生成するクラスを参考に見ていたところ、
http://www.plusmb.jp/2009/02/06/2439.html

クラスの最後の処理に、
$password .= $chars{$num};
とあります。

私自身が、初めて、$chars{$num};を見まして、
この場合、
$charsに入っているのが、英数字がずらっとならんだ中から、
$num文字目を抽出してきているようです。

こちらの挙動の解説が知りたくて、サイトなどを教えていただきたく
お願いになります。

Aベストアンサー

http://jp2.php.net/manual/ja/language.variables.variable.php

でしょうか。
可変変数の振舞を使った書き方ですね。

$string = 'abcde';
$a = $string{0}; // $a = 'a'
$b = $string{1}; // $b = 'b' になる。

$i = 2;
$c = $string{$i}; // $c = $string{2} --> $c = 'c'

可変変数は変数代入時の左辺にも使えるのですが、
訳が分からなくなるので、あまり使わないようにしています。

$aaa = 'bbb';
$$aaa = $aaa{0};

var_dump($bbb); // $bbb='b'

Q動的に変数をセット後他クラスから参照する場合

コンストラクタで変数にセットした後
他のクラスでインスタンスを生成することなく
セットした変数を参照したいのですが、
staticにすると、他クラスで変数を変更することも
できてしまいます。他の方法がありますでしょうか?
変数はprivateにして、getterで取得するという方法も
考えられますが、static finalな変数として扱う方法が
あるか、お分かりの方いらっしゃいましたら教えてください。

Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。

例)
Class A{
 static final String aaa;
A(String paraStr){
aaa = paraStr;
}
}

Class B{
static void main(String[] args){
new A("test");
}
}

Class C{
void chStr(){
System.out.println(A.aaa);
A.aaa = "changeStr"
System.out.println(A.aaa);
}
}

期待する値
test
test

もしくは、実行時にfinalの値は変更できない等のException

宜しくお願いします。

コンストラクタで変数にセットした後
他のクラスでインスタンスを生成することなく
セットした変数を参照したいのですが、
staticにすると、他クラスで変数を変更することも
できてしまいます。他の方法がありますでしょうか?
変数はprivateにして、getterで取得するという方法も
考えられますが、static finalな変数として扱う方法が
あるか、お分かりの方いらっしゃいましたら教えてください。

Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。

例)
Class A{
 static final...続きを読む

Aベストアンサー

static finalな変数
は、コンストラクタを使わなくても使用できなければいけませんから
質問文のようにそのクラスのコンストラクタからであっても、既に変更はできません。

Qformタグを使用した時の$_POST['example ']の受取り

今MySQLを使用して、サンプルのデータベースを構築して、HP上で条件検索して結果を表示できるようなプログラムを作っています。
そこで質問したいのですが、formタグの中でinputタグ等を記述し他のphpファイルにデータを送るとき、nameで"example"と記述したとしたら$_POST['example']のような形で受け取ると思うのですが、例えばwhile等でチェックボックスを複数作成(以前にとある処理があり、その結果によって作成される個数が変動するとすると)して、各チェックボックスのデータを送る場合、配列を使用してnameで指定した"example"の後部に0から順番に"example0","example1"…と付け加えてやることでチェックボックスを判別してデータを送ってやろうと思ったのですが、その場合データの受取り側も$_POST['example0'],$_POST['example1']…と受けたら無ければなりません。しかしexampleの後部の数字をカウントしながらデータを受け取るやり方が分かりません。
こういった場合どうすればよいのでしょうか?
分かりにくい説明で理解し辛いとは思いますが、どうかよろしくお願いします。

今MySQLを使用して、サンプルのデータベースを構築して、HP上で条件検索して結果を表示できるようなプログラムを作っています。
そこで質問したいのですが、formタグの中でinputタグ等を記述し他のphpファイルにデータを送るとき、nameで"example"と記述したとしたら$_POST['example']のような形で受け取ると思うのですが、例えばwhile等でチェックボックスを複数作成(以前にとある処理があり、その結果によって作成される個数が変動するとすると)して、各チェックボックスのデータを送る場合、配列を使用してnam...続きを読む

Aベストアンサー

<input type="checkbox" name="example[]" value="A">A<br>
<input type="checkbox" name="example[]" value="B">B<br>
<input type="checkbox" name="example[]" value="C">C<br>
<input type="checkbox" name="example[]" value="D">D
の様にチェックボックスを書いている時
foreach($_POST['example'] as $Index => $Value){

}
の様にして値を取り出すことができます。


人気Q&Aランキング

おすすめ情報