我include了一个文件,里面已经包含了一个对象$obj,现在要为这个对象增加一个方法,可行吗?比如在a.php文件中代码是这样:class P
{
function sub($a, $b)
{
return $a-$b;
}
}$obj = new P();在b.php文件中是这样,
include("a.php");要为$obj对象增加一个加法功能,以便在b.php中进行加法运算,如:
$sum = $obj->add(3,67);
但是不能对a.php中的类P进行修改,有什么办法吗?

解决方案 »

  1.   


    include("a.php");
    class B extends P
    {
    function add($a, $b)
    {
    return $a+$b;
    }
    }
    $obj = new B();
    $sum = $obj->add(3,67);
      

  2.   

    魔术方法__call()可以实现(在P类中)或者你在b.php中再写一个子类来继承父类P,在子类中定义add()方法。
      

  3.   

    忘了说了,include("a.php");后得到对象$obj,但是不知道$obj的类名,因为$obj是利用工厂得到的,类型可能是P也可能是B,只能通过get_class得到。include("a.php");$cls = get_class($obj);class FixedClass extends $cls
    {

    }
    报语法错误,而且也不能对文件a.php进行修改。其实是使用adodb时没有GetList功能,我想为adodb增加一个GetList功能,可以在adodb源码中加代码实现,只是不想对adodb进行任何修改,因为以后可能要用adodb新版本,修改源代码后每次升级都要再改源代码。
      

  4.   

    可以这样写
    class P
    {
        function sub($a, $b)
        {
            return $a-$b;
        }
    }
    $obj = new P;$cls = get_class($obj);$temp = <<< TPL
    class FixedClass extends $cls {
        function add(\$a, \$b)
        {
            return \$a+\$b;
        }
    }
    TPL;
    eval("$temp");$p = new FixedClass;print_r(get_class_methods($p));
      

  5.   

    若把扩充定义代码用 inclue 载入,效果就更好
      

  6.   


    class Example {
        function foo() {
            echo "foo!\n";
        }
    }// create an Example object
    $e = new Example();// Add a new public method
    classkit_method_add(
        get_class($e);,
        'add',
        '$num1, $num2',
        'return $num1 + $num2;',
        CLASSKIT_ACC_PUBLIC
    );// add 12 + 4
    echo $e->add(12, 4);需要安装相关的classkit pecl扩展