PHP从另一个不是孩子的类中调用一个方法


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中实例化一个名为$c的新a,但它不起作用:

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);
   }
 }