PHP call a method from other class that is not a child of
我有两个A和B班。因此,如果B扩展了A,那么我可以访问A的方法,它可以像预期的那样工作:
1 2 3 4 5 6 7 8 9 10 11 | abstract class A{ public function sum($num1, $num2){ return $num1 + $num2; } } class B extends A{} $test = new B(); echo $test->sum(1,2); // output 3 |
但如果我不希望b扩展a,并且仍然希望访问b中a的方法,那该怎么办呢?可能吗?
我尝试了下面的代码,通过在B中实例化一个名为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | abstract class A{ public function sum($num1, $num2){ return $num1 + $num2; } } class B{ $c = new A; public function get_sum($n1, $n2){ return $c->sum($n1, $n2); } } $test = new B; echo $test->get_sum(1,2); |
是否可以调用不是调用方父级的类方法?
至少有两种方法可以在不扩展b的情况下使用sum()方法。如果a不是抽象类,则可以实例化a对象并将其赋给b的属性,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php class A{ public function sum($num1, $num2){ return $num1 + $num2; } } class B { public $property; public function __construct($object) { $this->property = $object; } } $obj = new A(); $test = new B($obj); echo $test->property->sum(1,2)," "; // output 3 ?> |
我认为前面的技巧是用"构图"这个词来表达的。在这种情况下,任何求和工作都会委托给已经分配了可以处理该任务的对象的属性。
您可以使用一个特性来解决这个问题,因为您的A类只有一个方法而没有属性,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php trait A { public function sum($num1, $num2){ return $num1 + $num2; } } class B { use A; } $test = new B(); echo $test->sum(2,3); // output 5 ?> |
静态访问。例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 | abstract class A{ public function sum($num1, $num2){ return $num1 + $num2; } } class B{ public function get_sum($n1, $n2){ return A::sum($n1, $n2); } } $test = new B; echo $test->get_sum(1,2); |
在这种情况下,应该将要使用的方法声明为静态方法。检查这个
我建议您修改代码(向函数添加static)
1 2 3 4 5 | abstract class A{ public function sum($num1, $num2){ return $num1 + $num2; } } |
你的B班呢
1 2 3 4 5 6 | class B{ public function get_sum($n1, $n2){ return A::sum($n1, $n2); } } |