我正在为WooCommerce编写一个插件,今天突然出现了一些问题,我在想是否有办法花费PHP类,就像我们在JavaScript中这样做而不触及PHP类中的任何内容(由于WooCommerce将得到更新,我们的更改将会消失)。
我找到了使用__call
方法的解决方案,但就像我说的那样,这个课程不应该被编辑。我希望能够使用类似WC()->My_custom_method()
之类的东西,而无需触及Woocommerce课程。它甚至可能吗?
例如在JavaScript中我们需要做的是:
Foo.prototype.bar = function (){
// ...
}
Foo.bar();
答案 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();
答案 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");
我没有测试代码,这只是一个想法