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

php中文网
发布: 2016-06-23 13:11:44
原创
1259人浏览过

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

lua
lua

本文档是lua-5.1中文手册;Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。 Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 是一个自由软件,它的使用许可决定了对它的使用过程一般没有任何保证。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

lua 1
查看详情 lua


回复讨论(解决方案)

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

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 不支持重载

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

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

<?phpfunction show() {     if (function_exists('ext_show')) {        ext_show();        return;    }    echo 'abc';}
登录后复制

“重写”函数则为:
<?phpfunction ext_show(){    echo 'ext_abc';}
登录后复制


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


extention.php
<?phpfunction show() {    echo 'extention.php';}
登录后复制


result.php
<?phpinclude '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进来

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号