让我们首先说明您遇到的问题不是使用 OOP,而是programming-overhead
用程序员的术语称为 or spaghetti-code
。
如果您遇到很多开销,这意味着浪费时间编写几乎完全相同的代码行,其中只有内容不同,但功能相同。然后开始切割与其功能相同但内容不同的代码。
你说还有更多要复制粘贴,甚至更复杂,我只做form
验证部分(我称之为阶段 1),这只是一个简单的例子,说明如何应用为你完成所有工作的逻辑提供它期望的输入。一个例子可能比其他例子更优雅。
以下所有代码均未经测试
定位具有相同功能的代码的示例。
// functionality on checking values is the same, but it's content is not
if (isset($_POST['submitButton'])) {
if (isset($_POST['money'])) {
if (is_numeric($_POST['money'])) {
和
// though every decision made by its content is only being produced once ..
} else
echo "You don't have that much money!";
} else
echo "Enter a valid number";
} else
echo "Enter how much you want to wager.";
现在的诀窍是找到一个逻辑上解决这个问题的解决方案。PHP的内置函数很多,但首先要掌握如何解决它的想法。一个例子是让每个key
,比如submitButton
,money
有一个等于not exists
如果没有设置/存在的值,比方说null
。其次,您正在将值与 提供的键进行比较$_POST
,所以无论如何......您的$_POST
数组是决策者。
可以看到一个关于如何使用将默认值应用于键jQuery
的方法构建库的敏锐示例,因此键始终具有值并且始终通过不首先检查它是否存在来做出决定。$.extend()
但是PHP也可以。
让我们默认值。
$_POST = array_merge(array(
'submitButton' => null,
'money' => 0,
'etc' => '...'
, $_POST);
构建一个函数来验证这个数组现在容易多了,因为你总是可以依赖一个存在的值。
您说您有更多需要验证的表单,接下来要解决的是验证某些字段的功能。
有效或无效形式的正式表示可以是数组,例如
$valid_form = array(
'submitButton' => array('not_null'),
'money' => array('not_null','int'),
'etc' => '...'
);
验证的功能是
function validateForm($values, $valid) {
// error array to be returned
$error = array();
// let's iterate over each value, remember we defaulted the $_POST array with
// all the fields it can have, so all fields should be iterated apon.
foreach($values as $key => $value) {
if(array_key_exist($key, $valid)) {
// logic content can be used by different functions, switch
// used here for simplicity
foreach($valid[$key] as $validation) {
switch($validation) {
case 'not_null':
if(is_null($value)) {
$error[] = "error logic";
continue; // skip rest
}
break;
case 'etc':
$error[] = "..";
break;
}
}
}
}
return $error ? $error : true; // true being valid
}
错误处理可以通过多种方式完成,仅举一个简单的示例(取决于该项目的广泛程度),您可以将错误内容绑定到验证键,例如
$vfe = $valid_form_errors = array( // $vfe for simlicity's sake
'__no_error' => 'no error present for "%key%" validation',
'not_null' => '%key% should not be null',
'int' => '%key% expects to be an integer'
);
$valid_form = array(
'submitButton' => array('not_null'),
'money' => array('not_null','int'),
'etc' => '...'
);
创建正式错误消息的函数
function error_msg($key, $validation) {
global $vfe;
// error exists?
$eE = array_key_exists($validation,$vfe);
return str_replace('%key%', $eE?$key:$validation, $vfe[$eE?$validation:'__no_error']);
}
而在简单的开关中,错误逻辑是
foreach($valid[$key] as $validation) {
switch($validation) {
case 'not_null':
if(is_null($value))
$error[] = error_msg($key, $validation);
break;
case 'etc':
$error[] = "..";
break;
}
}
那么你的代码使用不同的逻辑会是什么样子呢?
// first stage ..
$form_valid = validateForm($_POST, $valid_form);
if ($form_valid === true) {
// second stage, same logic be applied as with validateForm, etc.
if($_POST['money'] <= $user['money']) {
$query = mysql_query("SELECT * FROM someTable WHERE id={$user['id']}");
if($result = mysql_fetch_array($query)) {
// third stage, same logic can be applied here..
if ($someOtherCheck == $user['someOtherData']) {
} else {
echo "This isn't right.";
}
} else {
echo "You don't have a row in some table!";
}
}
else {
$errors = $form_valid;
// error handling here
print_r($errors);
}
这一切都取决于您可以定义预期值的具体程度。您可以将每个功能扩展为更具体,例如将错误绑定到表单键,以便您可以在稍后阶段专门针对该输入。他们的关键是消除所有可能的重复,一个函数可能会为你做这一切,只需让他比较你期望的值,让他告诉他实际上有哪个值。