我知道这个问题有重复的地方,答案是重构代码。
然而,我不确定从哪里开始这个特殊的功能。
我正在PHP5中练习我的OOP API技能,并决定编写我自己的小数据库API。
我有一个函数有4个嵌套的if语句,我甚至不确定4个嵌套if是否很多。
但这段代码对我来说似乎很混乱,我想知道是否有人能提供任何关于如何优化、减少if等的提示。
在现实世界中,如何编写这种函数?
我的代码如下:
public function custom_query( $sql_query_string, $single_column = false){
$link = $this->_Link_ID;
// IF LINK IS VALID RESOURCE
if ( is_resource( $link ) ) {
$query_resource = mysql_query( $sql_query_string, $link );
// IF QUERY WAS VALID
if ( is_resource( $query_resource ) ) {
$this->_Query_ID = $query_resource;
$row_count = mysql_num_rows( $query_resource );
// IF $ROW_COUNT IS A NUMBER, VALID ROWS WERE FOUND
if ( is_numeric( $row_count ) ) {
if ( $single_column ){
$result_set = mysql_fetch_assoc( $query_resource );
return $result_set;
}
else {
$result_set = array();
for ( $row = 0; $row < $row_count; $row++ ) {
$result_set[$row] = mysql_fetch_assoc( $query_resource );
}
return ( object ) array ( 'row_count' => $row_count, 'result_set' => $result_set );
}
}
else {
die( "Failed To Retrieve Row Count Query: $sql_query_string MySQL Error: " . mysql_error( $link ) );
}
}
else {
die( "Invalid Query : $query_string. MySql : " . mysql_error( $link ) );
}
}
else {
die( "Query attempted without valid link resource. Query : $query_string" );
}
}
谢谢,
Alex
如果您决定在函数中停止使用die()
,您可以将代码重写为:
class Yours {
protected $errno = 0;
protected $error = '';
public function custom_query( $sql_query_string, $single_column = false){
$link = $this->_Link_ID;
// IF LINK IS VALID RESOURCE
if ( !is_resource( $link ) ){
$this->error = "Query attempted without valid link resource. Query : $query_string";
$this->errno = -1;
return null;
}
...
}
}
或者您可以使用异常;
public function custom_query( $sql_query_string, $single_column = false){
$link = $this->_Link_ID;
// IF LINK IS VALID RESOURCE
if ( !is_resource( $link ) ){
throw new Exception( "Query attempted without valid link resource. Query : $query_string", -1);
}
...
}
我个人会选择例外。。。但我想有些人不同意我的观点,我想读一下他们的论点
EDIT异常示例。我们将扩展php扩展类:
class DbException {
protected $sql;
public __construct( $message = "", $code = 0, $sql = '', $previous = NULL){
parent::__construct( $message, $code, $previous);
$this->sql = $sql;
}
public function getSql(){
return $this->sql;
}
}
// In model:
throw new DbException( "Query attempted without valid link resource.", -1, $query);
// In main application:
try {
ob_start();
// run whole application
} catch( DbException &e){
ob_clean(); // Suppress all output so far
echo "<html><body><div class="error">" . htmlspecialchars( $e->getMessage()) . "</div>";
if( NOT_IN_PRODUCTION){
echo "<div class='sql'>" . htmlspecialchars( $e->getSql()) . "</div>";
}
echo "</body></html>";
}
例外情况:
- 提供回溯(便于调试)
- 可以被类型捕获(因此您可以在适当的位置处理它们,或者让它们传播到主应用程序)
- 可以包含其他信息以进行更好的调试
由于函数中间的die
-ing没有问题,因此可以通过简单地否定if
s:来节省一些维护空间
public function custom_query( $sql_query_string, $single_column = false){
$link = $this->_Link_ID;
// IF LINK IS VALID RESOURCE
if ( !is_resource( $link ) ) die( "Query attempted without valid link resource. Query : $query_string" );
$query_resource = mysql_query( $sql_query_string, $link );
// IF QUERY WAS VALID
if ( !is_resource( $query_resource ) ) die( "Invalid Query : $query_string. MySql : " . mysql_error( $link ) );
$this->_Query_ID = $query_resource;
$row_count = mysql_num_rows( $query_resource );
// IF $ROW_COUNT IS A NUMBER, VALID ROWS WERE FOUND
if ( !is_numeric( $row_count ) ) die( "Failed To Retrieve Row Count Query: $sql_query_string MySQL Error: " . mysql_error( $link ) );
if ( $single_column ) {
$result_set = mysql_fetch_assoc( $query_resource );
return $result_set;
}
else {
$result_set = array();
for ( $row = 0; $row < $row_count; $row++ ) {
$result_set[$row] = mysql_fetch_assoc( $query_resource );
}
return ( object ) array ( 'row_count' => $row_count, 'result_set' => $result_set );
}
}