问题 如何覆盖内置的PHP函数?


我想覆盖,让我们说 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是否支持内置函数覆盖?


扩展


8612
2018-03-05 18:01


起源

方法重载?是。功能重载?没有。 - John Conde
您可以尝试使用命名空间来使用相同的函数名称,但保持函数分离。 - Jimmy Sawczuk
只是 if(count($rows) > 3) 管他呢。 - Xeoncross
这是怎么回事: php.net/manual/en/function.override-function.php ?是否有可能在此期间弃用?是否可以提供匿名函数而不是“字符串代码”?


答案:


我认为可以这样做:

//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
?>

在这里测试一下


12
2018-03-05 18:31



是的,这可能会奏效,但每个用户都必须拥有 php.net/manual/en/book.apd.php 安装在他/她的服务器上......
@Zlatan True,替代方案是他们解释的命名空间 这里。命名空间仅适用于PHP 5.3及更高版本。 - Ron van der Heijden
大!这意味着我可以在我的脚本之上命名一个命名空间,让我们说: "mysql2pdo",并覆盖所有 mysql_* 在整个脚本中动态运行?
是的,编辑了我的答案 - Ron van der Heijden
只需添加 use PDO,我的回答很少编辑 - Ron van der Heijden


安装 runkit & 使用 runkit_function_redefine。只在开发/测试服务器上执行,从不在生产中。


1
2018-03-05 18:02



我已经扩展了我的问题,请重新查看:)
为什么从未投入生产? - Kamil Dziedzic
@Zlatan:在那种情况下......不,不能做,除非他们没有 mysql 安装。 - Wrikken
@KamilDziedzic:因为它会导致糟糕的性能问题,会让开发人员陷入疯狂的追逐,而且不应该需要(通常只是懒人的重构方式)。 - Wrikken
@Wrikken,懒惰?这很经济。 - Pacerier