日期:2014-05-16  浏览次数:20364 次

如何用自定义函数文件对另一个php里的函数重写
本帖最后由 qq37431300 于 2014-01-16 10:28:54 编辑
为了不修改程序的系统文件,防止以后升级后修改过的文件会给升级时覆盖,所以想自己新建一个自定义函数库文件: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.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();


------解决方案--------------------
不可以!
你的设想是在php中是不可实现的,因为 php 不支持重载

楼上提及的 命名空间 虽然可以缓解这一矛盾
但是并不适合的的应用场景,因为你不打算修改原系统代码,而函数的调用又是原系统发起的