如何添加/覆盖方法而不在PHP中扩展类?

时间:2014-04-05 03:41:01

标签: php override

如何在不扩展php的类的情况下添加/覆盖方法?

举个例子:

<?php
DateTime.aMethod = function($inp)
{   //....
};

$datetime = new DateTime();

$datetime.aMethod('value');


DateTime.aStaticMethod = static function($inp)
{   //....
};

DateTime::aStaticMethod('value');

2 个答案:

答案 0 :(得分:0)

我想说你不能在运行时用PHP动态地向类中添加方法。

但你可以试试runkit扩展并试试这个实验函数: runkit_method_add

  

此功能是实验性的。它的功能是这个功能的行为   名称和周围文档可能会更改,恕不另行通知   PHP的未来版本。使用此功能需要您自担风险。

示例:

<?php

runkit_method_add(
    'DateTime',
    'aMethod',
    '$inp',
    'return $inp;',
    RUNKIT_ACC_PUBLIC
);

$datetime = new DateTime();

$datetime->aMethod('value');

runkit_method_add(
    'DateTime',
    'aStaticMethod',
    '$inp',
    'return $inp;',
    RUNKIT_ACC_STATIC
);

DateTime::aStaticMethod('value');

答案 1 :(得分:0)

Runkit很糟糕

因为,看看它......

这个问题的非可怕答案是uopz

不可怕的代码是:

<?php
uopz_function(DateTime::class, "aMethod", function($arg){
    return $arg;
});

uopz_function(DateTime::class, "aStaticMethod", function($arg){
    return $arg;
}, ZEND_ACC_STATIC);
?>