我知道这个问题有重复,答案是重构代码。
但是我不知道从哪个特定功能开始。
我在PHP5中练习我的OOP API技能,并决定编写自己的小数据库API。
我有一个带有4个嵌套if语句的函数,我甚至不确定4嵌套是否很多。
但这段代码对我来说似乎很混乱,并且想知道是否有人可以提供如何优化,减少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" );
}
}
谢谢,
亚历
答案 0 :(得分:2)
由于die
在函数中间没有问题,你可以通过简单地否定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 );
}
}
答案 1 :(得分:2)
如果您决定在功能中停止使用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);
}
...
}
我个人会去寻求例外...但我想有些人不同意我的意见,我想阅读他们的论点。
编辑例外情况。我们将扩展php Extension class:
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>";
}
例外: