2011-05-01 129 views
1

我在這裏使用PHP,我有兩個類。我可以在另一個類中調用一個類的函數嗎?例如:B類A類呼叫功能

 
class A 
{ 
    function a_func() 
    { 
     echo "A function"; 
    } 
} 

$a = new A(); 

class B 
{ 
    function b_func() 
    { 
     $a->a_func(); // This is the thing I'm stuck with. 
    } 
} 

我希望我在這裏說清楚。我看了Google,但我不知道這是什麼,所以我什麼也沒有提出。謝謝你的幫助。

回答

1

你有2個解決方法: 1)如果你的a_func不需要一個實例(好像是這種情況),喲ü可以使函數靜態和從第二類

class A 
{ 
    public static function a_func() 
    { 
     echo "A function"; 
    } 
} 

class B 
{ 
    function b_func() 
    { 
     A::a_func(); 
    } 
} 

2)1)如果您需要a_func一個實例,你不得不創建一個叫它:

class A 
{ 
    public function a_func() 
    { 
     echo "A function"; 
    } 
} 

class B 
{ 
    function b_func() 
    { 
     $a = new A; 
     $a->a_func(); 
    } 
} 
+0

我不得不承認我對PHP類很新。如果我採用這種方法,我是否可以訪問我之前設置的類A的第一個實例的變量(通過代理函數)。我問原始問題的原因是因爲我有兩個對象,我想從一箇中獲取數據,並在另一箇中使用它。 – Bojangles 2011-05-01 15:39:45

+0

我已經實現了第一個解決方案,並且我提出了這個錯誤:'在envars.php中的對象上下文中不使用$ this,使用'echo A :: a_func(「argument」)行時;'。這裏出了什麼問題?我將這些函數改爲'public static',但仍然是相同的錯誤。有任何想法嗎? – Bojangles 2011-05-01 15:57:32

+0

我還應該補充說明的是:$ this-> vars [$ var]'。我真的迷失在這裏,所以更多的幫助將不勝感激。 – Bojangles 2011-05-01 16:13:47

0

你可以,如果你製作$a本地b_func()

無論是

  • 聲明它global $a;b_func()(可能不是一個好主意,取決於你的使用情況)

  • 傳遞$a作爲參數傳遞給b_func()

    function b_func($a) 
    .... 
    
  • 製作$a的成員:

    $b = new B(); 
    $b->a = new a(); // Can be accessed by `b_func()` as `$this->a`# 
    
  • 或初始化$ab_func()

    function b_func() 
    { 
        $a = new A(); 
    

這是最好的在你的場景將依賴新生什麼A和B做的,什麼關係他們。

+0

感謝這Pekka。我應該在我原來的問題中說過這個,但原來的'$ a'將會保存我需要獲取值的變量。我不想創建另一個空白類,但在類型爲「$ a」的第一個對象中調用一個函數,該函數將獲得我之前設置的值。我有道理嗎? – Bojangles 2011-05-01 15:35:58

0

你可以叫a_func()如果實例A類第一:

class B 
{ 
    function b_funct() 
    { 
    $a = new A(); //create instance of A 
    $a->a_func(); //run function 
    } 
} 

一個替代方案是讓a_func靜:

static function a_funct() 

,並稱呼其爲:

A::a_function(); 
2

還不錯的答案,所以遠。別人還沒有提到一件事......

如果B需要對象A正常工作,你應該通過一個進入構造和使用object composition

class B { 

    protected $a; 

    public function __construct(A $a) { 
     $this->a = $a; 
    } 

    public function b_func() { 
     $this->a->a_func(); 
    } 

} 

$a = new A; 
$b = new B($a); 
$b->b_func(); 

你會看到,我已經在類B保護 財產。這是encapsulation,絕對是你應該閱讀的東西。

您應該閱讀的另一個重要的主題是dependency injection