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