PHP对象新增方法的问题

马六甲 2015-05-17 04:29:55
很普通的写法:



class MyClass
{
funciton a(){
echo 'a';
}
}


class MyClassExted extends MyClass
{
function b(){
echo 'b';
}
}

$test = new MyClassExted();
$test->b();




因为一些原因,我希望使用的时候可以是这样的:


$test = new MyClass();
$test->b();




就“好像”是这样:


class MyClass
{
funciton a(){
echo 'a';
}
}


class MyClass extends MyClass
{
function b(){
echo 'b';
}
}

$test = new MyClass();
$test->b();




但这显示不对的,新extends的类名必须与父类不同,那么问题来了?

有什么办法可以直接对一个类新增一个方法吗?
...全文
189 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dleno 2015-05-19
  • 打赏
  • 举报
回复
再给你个加强升级版

<?php
class api_base
{
     function a(){
       echo 'a111';
     }
     function __call($name, $param) {
        static $methods = array();
        if(!method_exists($this, $name)){
            list($api, $fun) = explode('_',$name);
			empty($fun) && $fun = 'index';
			if(!isset($methods[$api])){
                include_once('class.api.'.$api.'.php');
                $method = 'api_'.$api;
                $methods[$api] = new $api();
            }
			if(!method_exists($methods[$api], $fun)){
				die('error');
			}
            call_user_func_array(array($methods[$api], $fun), $param);
        }
     }
}
  
$test = new api_base();
$test->b(1,2,3);
$test->b(4,5,6);

$test->b_test(1,2,3);
$test->b_haha(4,5,6);
?>
class.api.b.php:
<?php
class api_b extends api_base
{
     function index($a,$b,$c){
       echo "$a - $b - $c <br>";
     }
     function test($a,$b,$c){
       echo "$a - $b - $c <br>";
     }
	 function haha($a,$b,$c){
       echo "$a - $b - $c <br>";
     }
}
?>
Dleno 2015-05-19
  • 打赏
  • 举报
回复
在版主的基础上修改下就可以了:

<?php
class api_base
{
     function a(){
       echo 'a111';
     }
     function __call($name, $param) {
		 static $methods = array();
		if(!method_exists($this, $name)){
			if(!isset($methods[$name])){
				include_once('class.api.'.$name.'.php');
				$method = 'api_'.$name;
				$methods[$name] = new $method();
			}
			call_user_func_array(array($methods[$name], $name), $param);
		}
     }
}
 
$test = new api_base();
$test->b();
?>
class.api.b.php:
<?php
class api_b extends api_base
{
     function b(){
       echo 'bbbbbbbbb';
     }
     
}
?>
傲雪星枫 2015-05-17
  • 打赏
  • 举报
回复

class MyClass
{
     function a(){
       echo 'a';
     }

     function __call($name, $param){
     	if($name=='b'){
     		echo 'b';
     	}
     }
}

$obj = new MyClass();
$obj->b();
马六甲 2015-05-17
  • 打赏
  • 举报
回复
这种需求好像有点奇怪,说一下使用场景。 系统中有一个 类文件 class.api.php

class api
{
	function base_a(){
	}
	function base_b(){
	}


	function user(){
	}

	function news(){
	}

	function shop(){
	}

	function game(){
	}

	function bbs(){
	}
}
这个类在很多文件中引用过,使用方法类似于此

include('class.api.php');
$api = new api;
$api->shop();
新需求是这个 类中 需要再新增几个方法。 原本没有预料到这个类中会用到这么多的方法,所以全部写在一起了。 那么,对于 使用 $api->shop() 方法的程序,去引用一个包含了所有方法的类,好像是有点浪费了。 并且后期,这个 class.api.php 可能还需要就行扩展,那么 class.api.php 的文件体积会越来越大,显示不合理。 所以现在拆分这个类。 将 class.api.php 中的 基础方法保存为 class.api.base.php

class api_base
{

       function base_a(){}
       function base_b(){}
}
而其他的每个方法单独保存为一个文件。 比如 $api->shop() 方法,新增一个 class.api.shop.php

include('class.api.base.php');
class api_shop extends api_base
{
      function shop(){

      }

}
那么对于原来使用 $api->shop() 的地方,引用 class.api.shop.php 即可。

include('class.api.shop.php');
$api = new api_shop;
$api->shop();
问题就在于这里了,系统很多地方使用的是

include('class.api.php');
$api = new api;
$api->shop();
为了兼容系统中已经使用过这个类的代码,原本想,如果可以直接对类进行扩展,那么一切就很简单了。 现在看来似乎不太现实(如果真的有办法实现,请赐教)。 那么有什么方案可以保留 原 class.api.php 并且将 class.api.shop.php、class.api.news.php、class.api.game.php。。。。。等扩展类的中的方法集中这个文件中。 这样做纯属为了兼容系统旧文件的写法。 还有:不能直接保留 class.api.php,因为 shop()、game()、user()等方法还要进行维护,如果直接保留class.api.php,后期维护的时候,每次都要处理两次,太麻烦。
xuzuning 2015-05-17
  • 打赏
  • 举报
回复
你可以给类预留一个接口呀
class MyClass
{
     funciton a(){
       echo 'a';
     }

     function __call($name, $param) {
        if(function_exists($name)) {
            return call_user_func_array($name, $param);
        }
     }
}

function b() {
  echo $b;
}

$test = new MyClass();
$test->b();
daidongsheng 2015-05-17
  • 打赏
  • 举报
回复
trait

trait class a
{
    public function b()
    {
         echo 1;
    }
}

class c
{
    use a;
}
$test = new c;
$c->b();  // 1
果酱很好吃 2015-05-17
  • 打赏
  • 举报
回复
没有这种写法,类名不能重复定义 为什么不在MyClass类里面写方法b() 呢,MyClassExted 继承 MyClass后,可以重写MyClass 的方法b()

class MyClass
{
     function a(){
       echo 'a';
     }
	 function b(){
       echo 'MyClass b';
     }
}
class MyClassExtend extends MyClass
{
     function b(){
          echo 'MyClassExtend b';
     }
}
 
$MyClass = new MyClass();
$MyClass->b();//MyClass b

$MyClassExtend = new MyClassExtend();
$MyClassExtend->b();//MyClassExtend b
马六甲 2015-05-17
  • 打赏
  • 举报
回复
看了官方文档,没发现有这样的写法,至少5.4我没看到。 是我没发现呢? 还是真的 就没有呢?在线等大神

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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