2014-11-02 47 views
-1

一个孩子,我有两个类A和B. 所以当B延伸的话,我可以访问的方法和预期的一样,因此正常工作:PHP调用其他类中的方法是不是

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并仍想访问A的B方法会怎么样?可能吗?

我尝试下面的代码实例化一个新的A内部b调用它$c但它不工作:

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

任何想法,如果它的所有可能调用类的方法不是的父母呼叫者?

+0

什么是原始任务你解决?答案在你最初想达到的目标上差别很大。 – zerkms 2014-11-02 07:12:41

+0

而不是'return $ c->'应该是'return $ this-> c->' – Cheery 2014-11-02 07:14:20

+0

@Cheery试过'return $ this-> c-> sum($ n1,$ n2);'但它不会工作。 – anagnam 2014-11-02 07:16:09

回答

1

至少有两种方法可以使用的总和()方法,而不必乙延伸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 
?> 

我相信前面的技术通过术语“组合”。在这种情况下,任何总和工作都会被委托给已分配了可处理该任务的对象的属性。

您可以改为使用特点,因为你的一个类只有一个方法,并没有属性解决问题,具体如下:

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

这个特质是完美的!谢谢 – anagnam 2014-11-02 08:39:14

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

@geoandi它的工作原理,但我担心的是它的静态函数,我想尽可能地避免静态函数,因为我将在其他可能需要它的课程中使用该方法。 – anagnam 2014-11-02 07:34:32

+0

它也可以不用sum()作为静态函数。 – geoandri 2014-11-02 07:53:14

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

它的工作原理,但我不希望A从外部那是实例化为什么我故意让它抽象。现在,如果我抽象出一个摘要,你的代码就会中断 – anagnam 2014-11-02 07:36:48

相关问题