时间:2021-07-01 10:21:17 帮助过:31人阅读
继承系统的函数库 然后写一个一样的函数名
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';}
- namespace testc;function test(){
- return 'c.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';}</pre--> <br>“重写”函数则为: <br> <pre class="sycode layui-box layui-code-view layui-code-notepad" name="code"><ol class="layui-code-ol"><li><!--?phpfunction ext_show(){ echo 'ext_abc';}</pre--> <br> <br>但是跟你现在的需求还是有差别的,那么我们可以考虑先用程序处理一下a.php,以下是方案的简单测试代码: <br>a.php <br> <pre class="sycode layui-box layui-code-view layui-code-notepad" name="code"><ol class="layui-code-ol"><li><!--?phpfunction show() { echo 'a.php';}function get() { echo 'a.php--->get';}</li></ol></pre> <br> <br>extention.php <br> <pre class="sycode layui-box layui-code-view layui-code-notepad" name="code"><ol class="layui-code-ol"><li><!--?phpfunction show() { echo 'extention.php';}</pre--> <br> <br>result.php <br> <pre class="sycode layui-box layui-code-view layui-code-notepad" name="code"><ol class="layui-code-ol"><li><!--?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();</li></ol></pre> <br> <br>这个还可以优化为: <br>先判断是否存在 a.runtime.php 文件,如果不存在,执行上面的处理过程,将$new_a写入到 a.runtime.php 然后include进来 </li></ol></pre></li></ol></pre>