PHP函数覆盖?

时间:2016-02-12 22:36:36

标签: php mysql

我在开发过程中遇到两个版本的PHP之间存在以下情况。我暂时做了以下几点:

$oldphp = getdbVersion();
if($oldphp)
{
   $result = mysql_query($sql) or die(mysql_error());
}
else
{
   $result = mysqli_query($conn, $sql) or die(mysql_error());
}

无论如何都要覆盖这些函数,以便您可以调用新名称,但会自动调用旧名称,因此代码只有:

 mysqli_query ($sql);

但会根据服务器版本看到正确的功能吗?

我最终使用了一个包装器,所以代码检查不需要遍布整个地方来检查函数是否存在:

function _mysql_query($connection, $findrecords)
{
   if(check_sql_version())
   {
      $result = mysql_query($findrecords);
   }
   else
   {
      $result = mysqli_query($connection, $findrecords);
   }
   if( ! $result)
   {
      die('Invalid query: ' . (check_sql_version())? mysql_error():mysqli_error());
   }
   return $result;
 }

2 个答案:

答案 0 :(得分:0)

Appaprently you can override PHP built-in functions(使用APD extension),但是当你想要做的事情时,你应该有一个很好的用例。问题中的一个是一个这样的案例。

如果您需要同时支持mysql和mysqli扩展,那么您应该使用一组类和适配器来抽象数据库交互,其中每个适配器实现用于与数据库交互的公共接口。有许多数据库抽象库可供使用,您可能会找到一个满足系统要求的库,同时仍然通过mysql和mysqli扩展提供访问方法。

ADODB是经典之作。作为一个遗留库本身,它很可能适用于您必须支持的旧版PHP,同时仍然可以使用mysqli扩展。文档在这里:

http://phplens.com/lens/adodb/docs-adodb.htm

答案 1 :(得分:0)

您需要为所有功能定义包装器,这是一个很好的示例,说明如何执行此操作here。在这种情况下,它提供了向后兼容性,如果您希望在较新版本的PHP中运行许多遗留代码,这将非常有用。但是你的情况正好相反。你应该开发使用mysqli配置前向可比性垫片。

要调用(前进)垫片,只需...

if(!function_exists('mysqli_connect')) {
    require_once 'mysqli.inc,.php';
}

但是我并不知道mysqli现有的前向垫片。