Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法像javascript那样向php类添加方法?_Php - Fatal编程技术网

有没有办法像javascript那样向php类添加方法?

有没有办法像javascript那样向php类添加方法?,php,Php,我正在为WooCommerce编写一个插件,今天我突然想到了一件事,我在想是否有一种方法可以像我们在JavaScript中那样扩展PHP类,而不涉及PHP类中的任何内容(因为WooCommerce将得到更新,我们所做的更改也将消失)。 我找到了类似于使用\u call方法的解决方案,但正如我所说的,这个类不应该被编辑。我希望能够在不接触Woocommerce类的情况下使用像这样的东西WC()->My_custom_method()。这可能吗 例如,在JavaScript中,我们需要做的就是: F

我正在为WooCommerce编写一个插件,今天我突然想到了一件事,我在想是否有一种方法可以像我们在JavaScript中那样扩展PHP类,而不涉及PHP类中的任何内容(因为WooCommerce将得到更新,我们所做的更改也将消失)。 我找到了类似于使用
\u call
方法的解决方案,但正如我所说的,这个类不应该被编辑。我希望能够在不接触Woocommerce类的情况下使用像这样的东西
WC()->My_custom_method()
。这可能吗

例如,在JavaScript中,我们需要做的就是:

Foo.prototype.bar = function (){
     // ...
}
Foo.bar();

PHP没有原型继承,类也没有JavaScript中的原型。你可以用一些黑客来模拟你所要求的,但这最终会导致代码难以维护。所以不要去那里

在上有一个GitHub项目,具有概念验证实现。你可能会发现学习很有趣

不用说,如果您的目标只是向类添加一些功能,那么您仍然可以使用PHP的继承,例如扩展WooCommerce类并在子类中添加您的修改。然后使用该新类的实例,例如

class MyClass extends SomeWooCommerceClass {
    public function bar() {
        // your own implementation of bar
    }
}

$myObj = new MyClass();
$myObj->bar();

如果您的目标是改变现有对象实例的行为,请考虑将实例包装为A,例如

然后通过将对象传递给装饰器来使用它:

$woo = new SomeWooCommerceClass();
$decoratedWoo = new WooCommerceDecorator($woo);
echo $decoratedWoo->foo();

另请参见

您的最佳选择是使用扩展类

class MyClass extends Foo {
    public function methodInFoo() {
        echo "I Am extended";

        parent::methodInFoo();
    }

    public function additionalFunction() {
        echo "I am new method that is not presented in Foo";
    }
}

这样,您甚至可以让Composer自动更新核心类,当您使用此扩展类时,您将拥有自己的函数以及核心类中的所有功能。

我不建议这样做,但您可以执行以下操作

class Test {
    private $myMethods = array();

    public addMethod($name, $func) {
        $myMethods[$name] = $func;
    }

    public callMethod() {
        $myMethods[$name]();
    }

}
....
$test->addMethod("doSomething", function(){ echo 123;});
$test->callMethod("doSomething");

我没有测试代码,这只是一个想法

为什么不使用
扩展
?@AbhayMaurya将该类继承到您的其他自定义类中呢?这不是问题,我只是在想,在PHP中是否可以实现这种功能?是的,在OOP PHP中确实可以。如果您熟悉类继承,它与java一样。您可以将不想干扰的类保持原样,创建自己的类继承主类以访问其属性,然后可以管理自己自定义类中的所有内容。更多参考请参见:@AbhayMaurya不,我不是在谈论类继承,我已经知道了,我想知道是否有一种方法可以直接从类外部将方法添加到类中,而不必触及类本身!?您应该使用组合或继承来扩展类的功能。这最终会导致代码难以维护
class Test {
    private $myMethods = array();

    public addMethod($name, $func) {
        $myMethods[$name] = $func;
    }

    public callMethod() {
        $myMethods[$name]();
    }

}
....
$test->addMethod("doSomething", function(){ echo 123;});
$test->callMethod("doSomething");