有没有办法在javascript中添加php类的方法?

时间:2016-12-15 14:44:18

标签: php

我正在为WooCommerce编写一个插件,今天突然出现了一些问题,我在想是否有办法花费PHP类,就像我们在JavaScript中这样做而不触及PHP类中的任何内容(由于WooCommerce将得到更新,我们的更改将会消失)。 我找到了使用__call方法的解决方案,但就像我说的那样,这个课程不应该被编辑。我希望能够使用类似WC()->My_custom_method()之类的东西,而无需触及Woocommerce课程。它甚至可能吗?

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

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

3 个答案:

答案 0 :(得分:3)

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

https://github.com/bdelespierre/prototype.php有一个带有概念证明实施的GitHub项目。你可能会觉得学习很有意思。

毋庸置疑,如果您的目标只是为某个类添加一些功能,您仍然可以使用PHP的继承,例如:扩展WooCommerce类并在子类中添加修改。然后使用该新类的实例,例如

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

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

如果您的目标是更改现有对象实例的行为,请考虑将实例包装到Decorator中,例如

class WooCommerceDecorator {
    private $instance;
    public function __construct(SomeWooCommerceClass $instance) {
        $this->instance = $instance;
    }

    public function foo() {
        $original = $this->instance->foo();
        $original+= 42;
        return $original;
    }
// … more methods

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

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

另见PHP manual on Inheritance

答案 1 :(得分:1)

你最好的电话是使用扩展课程。

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自动更新核心类,当你使用这个扩展类时,你将拥有自己的函数以及核心类中的所有功能。

答案 2 :(得分:1)

我不推荐这个,但你可以做一些像

这样的事情
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");

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