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

时间:2014-11-02 07:11:01

标签: php

我有两个A和B班。 因此,如果B扩展A,那么我可以访问A的方法,它可以正常工作,如下所示:

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来尝试下面的代码,但它不起作用:

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

是否有可能调用一个不是调用者父类的类方法?

3 个答案:

答案 0 :(得分:1)

在这种情况下,您应该声明要用作静态的方法。查看this

我建议你改变代码(给函数添加静态)

 abstract class A{
   public  function sum($num1, $num2){
    return $num1 + $num2;
 }
}

为你的B班

 class B{

public function get_sum($n1, $n2){
    return A::sum($n1, $n2);
   }
 } 

答案 1 :(得分:1)

静态访问它。例如:

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

答案 2 :(得分:1)

至少有两种方法可以使用sum()方法而不使用B扩展A.如果A不是抽象类,那么您可以实例化A对象并将其分配给B的属性,如下所示:

<?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),"\n"; // output 3
?>

我认为前面的技术是术语“组成”。在这种情况下,任何总和工作都会委托给已分配了一个可以处理该任务的对象的属性。

您可以使用特征来解决问题,因为您的A类只有一个方法而没有属性,如下所示:

<?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
?>