如何用自定义函数文件对另一个php里的函数重写

mrtelanpu 2014-01-16 10:28:22
为了不修改程序的系统文件,防止以后升级后修改过的文件会给升级时覆盖,所以想自己新建一个自定义函数库文件:extention.php ,在系统运行时 include这个extention.php进去,这样就可以在extention.php 里面对系统函数进行修改也可以在extention.php里面写自己的函数。

比如
有这样3个php文件
a.php 系统的函数库文件,不可以修改它
extention.php 自己自定义的函数库文件,随便添加和修改
result.php 调用函数库里面的方法文件

a.php
function show()
{
$str = 'this is a';
return $str;
}

extention.php 我在里面也写一个 show()的函数,想去修改a.php里面的show()方法
function show()
{
$str = 'this is my extention a';
return $str;
}

result.php 这里include了上面2个php文件,并调用show()方法
include 'a.php';
include 'extention.php';

$result = show();
echo $result;

这样访问result.php 会报 Cannot redeclare的错误。

网上找了资料说可以用 命名空间,但是好像效果不是我想要的。
我是想不去动系统的函数库文件,比如上面的那个a.php;只修改我的extention.php自定义函数库文件,从而能对a.php里面的函数进行修改。不知道能否做到呢?
...全文
463 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
怪才 2016-04-05
  • 打赏
  • 举报
回复
我在设计可重载的系统函数的时候,使用的是以下的方案: 系统函数定义为:

<?php
function show() {
     if (function_exists('ext_show')) {
        ext_show();
        return;
    }
    echo 'abc';
}
“重写”函数则为:

<?php
function ext_show(){
    echo 'ext_abc';
}
但是跟你现在的需求还是有差别的,那么我们可以考虑先用程序处理一下a.php,以下是方案的简单测试代码: a.php
<?php
function show() {
    echo 'a.php';
}

function get() {
    echo 'a.php->get';
}
extention.php
<?php
function show() {
    echo 'extention.php';
}
result.php
<?php
include 'extention.php';
//include 'a.php';
$a = file_get_contents('a.php');
$a = str_replace(array('<?php', '?>'), '', $a);
$a = str_replace(array("\r\n", "\r", "\n"), '', $a);
$a = str_replace('function ', PHP_EOL.'function ', $a);
$a_fun = explode(PHP_EOL, $a);
$new_a = '';
foreach($a_fun as $fun) {
    if (preg_match('|function\s(.*?)\(|i', $fun, $match)) {
        $fun_name = trim($match[1]);
        if (!function_exists($fun_name)) {
            $new_a .= $fun.PHP_EOL;
        }
    }
}
eval($new_a);
show();
这个还可以优化为: 先判断是否存在 a.runtime.php 文件,如果不存在,执行上面的处理过程,将$new_a写入到 a.runtime.php 然后include进来
xuzuning 2014-01-17
  • 打赏
  • 举报
回复
不可以! 你的设想是在php中是不可实现的,因为 php 不支持重载 楼上提及的 命名空间 虽然可以缓解这一矛盾 但是并不适合的的应用场景,因为你不打算修改原系统代码,而函数的调用又是原系统发起的
haibrother 2014-01-17
  • 打赏
  • 举报
回复
你的a.php 应该不是全都不可以改的吧。 建议使用 PHP的命名空间来调用同名函数。 举个例子。 test/b.php
namespace testb;

function test(){
	return 'b.php';
}
test/c.php
namespace testc;

function test(){
	return 'c.php';
}
test/a.php 来调用
include('b.php');
include('c.php');
echo \testb\test();
echo \testc\test();
lazysmile 2014-01-16
  • 打赏
  • 举报
回复
两个选择: 1、命名空间 2、直接修改目标函数
嘻哈大咖秀 2014-01-16
  • 打赏
  • 举报
回复
a.php function show() { $str = 'this is a'; return $str; } extention.php 我在里面也写一个 show()的函数,想去修改a.php里面的show()方法 class extention extends a{ function show() { $str = 'this is my extention a'; return $str; } }
嘻哈大咖秀 2014-01-16
  • 打赏
  • 举报
回复
继承系统的函数库 然后写一个一样的函数名

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧