如何覆盖内置的PHP函数?

18

我想要覆盖,比如说 mysql_num_rows,使用以下内容:

$dataset = array(array('id' => 1, 'name' => 'Zlatan', 'onSOF' => 1), array('id' => 1, 'name' => 'Guest', 'onSOF' => 0));

function mysql_num_rows($dataset) {
    return sizeof($dataset);
}

PHP支持内置函数覆盖吗?

扩展

我希望创建一个开源解决方案,它将覆盖所有现有的mysql_*函数,并在它们的函数体中使用PDO实例、方法和属性。

这意味着已经使用mysql_*并发现完全转移到PDO很困难的用户,只需包含此函数覆盖,所有属性、函数调用、函数返回值、参数值等都应保持不变。


方法重载?是的。函数重载?不是。 - John Conde
1
你可以尝试使用命名空间来使用相同的函数名称,但保持函数分开。 - Jimmy Sawczuk
只需要 if(count($rows) > 3) 或者其他的。 - Xeoncross
2个回答

22

我认为可以这样做:

//First rename existing function
rename_function('strlen', 'new_strlen');
//Override function with another
override_function('strlen', '$string', 'return override_strlen($string);');

//Create the other function
function override_strlen($string){
        return new_strlen($string);  
}

在这里找到它

请注意,每个主机都必须在服务器上安装http://php.net/manual/en/book.apd.php

编辑

另一种方法是使用命名空间。

<?php
    namespace mysql2pdo;
    use PDO;
    function mysql_connect() {
       return new PDO();
    }
    echo mysql_connect(); // Causes error because we don't have the parameters
?>

在这里测试它


是的,这可能有效,但每个用户都必须在他/她的服务器上安装http://www.php.net/manual/en/book.apd.php... - user1386320
@Zlatan 确实,像他们在这里解释的那样,替代方案是使用命名空间。命名空间仅适用于 PHP 5.3 及更高版本。 - Ron van der Heijden
太好了!这意味着我可以在脚本顶部命名一个命名空间,比如说:"mysql2pdo",并且在整个脚本中动态地覆盖所有的mysql_*函数? - user1386320
是的,但是你如何在该命名空间中导入PDO类? :) - user1386320
@ZlatanO。例如,use Symfony\Component\HttpFoundation\LaravelResponse as FoundationResponse; 这就是在该命名空间中使用另一个类的方式。 - Alex

2

我已经扩展了我的问题,请重新查看它 :) - user1386320
@Zlatan:在这种情况下……不行,除非他们没有安装mysql - Wrikken
3
因为它会导致糟糕的性能问题,让开发人员花费大量时间去寻找问题的根源,而且通常不应该是必需的(它通常只是规避重构的懒惰方式)。 - Wrikken
1
@Wrikken,懒惰?这是经济实惠。 - Pacerier
1
很少是这样的。在这里节省几分钟时间,将花费您大量的性能和后期调试时间。但是如果您喜欢在生产服务器上运行runkit-redefine,我不会阻止您,只会确保我永远不会雇用您 :P - Wrikken
@Wrikken,这取决于您的使用情况。 - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接