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

本文探讨如何创建一个名为extention.php的自定义函数库,以扩展或修改系统函数,同时保持对核心文件如a.php的隔离。通过实例和命名空间的使用,解释了为何直接修改原函数不可行,并提供了一种处理方法,即预处理系统函数并动态加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了不修改程序的系统文件,防止以后升级后修改过的文件会给升级时覆盖,所以想自己新建一个自定义函数库文件: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里面的函数进行修改。不知道能否做到呢?

回复讨论(解决方案)

继承系统的函数库 然后写一个一样的函数名

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;

}

}

两个选择:

1、 命名空间

2、直接修改目标函数

你的a.php 应该不是全都不可以改的吧。

建议使用 PHP的命名空间来调用同名函数。

举个例子。

test/b.phpnamespace 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();

不可以!

你的设想是在php中是不可实现的,因为 php 不支持重载

楼上提及的 命名空间 虽然可以缓解这一矛盾

但是并不适合的的应用场景,因为你不打算修改原系统代码,而函数的调用又是原系统发起的

我在设计可重载的系统函数的时候,使用的是以下的方案:

系统函数定义为:“重写”函数则为:

但是跟你现在的需求还是有差别的,那么我们可以考虑先用程序处理一下a.php,以下是方案的简单测试代码:

a.php

get';}

extention.php

result.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进来

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值