2013-06-12 49 views
1
class Foo { 
    public function sampleA(){ 
     echo "something ..."; 
    } 
} 

class Bar { 
    public function sampleB(){ 
     echo "something ..."; 
    } 
} 

$objectA = new Foo(); 

我想直接調用$ objectA-> sampleB(),而不是$ objectA-> somevariable-> sampleB(); 如何做到這一點?如何合併兩個對象包括功能在PHP

+1

那是不可能的。 Foo沒有方法'sampleB'。你的問題沒有任何意義。 – meagar

+1

'特質'呢? – BlitZ

+0

您是否希望在運行時或設計時將這兩個對象搗碎?運行時間爲 – Orangepill

回答

3

一種可能性是簡單地改變類聲明:

class Foo extends Bar { 

周圍的其他方式也是可能的;這真的取決於你的用例。 Traits也是一種可能性。

trait Bar { 
    public function sampleB(){ 
     echo "something ..."; 
    } 
} 

class Foo { 
    use Bar; 

    public function sampleA(){ 
     echo "something ..."; 
    } 
} 
+0

+1這可能是OP的意思 – Orangepill

+1

+1你已經打敗了我':)'儘管如此,我認爲將班級分成2個特徵對於這種情況更爲方便/合適。 – BlitZ

+0

@CORRUPT如果這就是OP之後的話,那麼是的:) –

2

您需要爲這兩個類創建一個門面;

class FooBar { 
    protected $foo; 
    protected $bar; 

    public function __construct (Foo $foo, Bar $bar){ 
     $this->foo = $foo; 
     $this->bar = $bar; 
    } 

    public function sampleA(){ 
      return $this->foo->sampleA(); 
    } 

    public function sampleB() { 
      return $this->bar->sampleB(); 
    } 
} 
3

您可以嘗試使用traits(PHP 5.4 +)多重繼承:

<?php 
header('Content-Type: text/plain'); 

trait Foo { 
    public function sampleA(){ 
     echo __METHOD__, PHP_EOL; 
    } 
} 

trait Bar { 
    public function sampleB(){ 
     echo __METHOD__, PHP_EOL; 
    } 
} 

class Baz { 
    use Foo, Bar; 
} 

$test = new Baz(); 
$test->sampleA(); 
$test->sampleB(); 
?> 

表演:

Foo::sampleA 
Bar::sampleB 
+0

+1多重繼承;-) –

+0

@Jack我只是希望OP不需要實例化這些類。然後特質註定,除非'class cFoo {使用Foo; } class cBar {use Bar; }'。 – BlitZ

+0

使用特質+1 –