2012-11-21 125 views
18

我仍然在學習OOP,所以這可能甚至不可能(儘管如果是這樣我會感到驚訝),我需要一些幫助來調用另一個類的方法。PHP:調用另一個類的方法

例如在ClassA I有這樣的方法:

function getName() 
{ 
    return $this->name; 
} 
現在

ClassB(不同的文件,但在同一目錄下),我想打電話給ClassAgetName(),我該怎麼做呢?我試圖做一個include()但這不起作用。

謝謝!

+0

分享代碼你正在使用調用getName() – Evert

+0

類B是否與類A有任何關係(如分層)?如果是這樣,B類可以擴展A類,你將可以訪問A類的功能。如果不是,你可以再描述一下你的兩個對象(他們代表什麼)。 – Mike

+0

事情是,A類已經擴展了另一個類(我從網上下載的simple_html_dom),所以我不想(甚至不知道我是否可以)擴展已經擴展了其他類的類A – Ryan

回答

40
//file1.php 
<?php 

class ClassA 
{ 
    private $name = 'John'; 

    function getName() 
    { 
    return $this->name; 
    } 
} 
?> 

//file2.php 
<?php 
    include ("file1.php"); 

    class ClassB 
    { 

    function __construct() 
    { 
    } 

    function callA() 
    { 
     $classA = new ClassA(); 
     $name = $classA->getName(); 
     echo $name; //Prints John 
    } 
    } 

    $classb = new ClassB(); 
    $classb->callA(); 
?> 
+0

這是你想要的,即使它目前是負面的。 –

+4

請注意,你現在不能輕易地單元測試你的'B'類,因爲你已經緊密地連接到'A'類。 – PeeHaa

+0

謝謝!這對我有用! – Ryan

5

你需要有ClassA的實例中ClassB的或有ClassB的繼承ClassA的

class ClassA { 
    public function getName() { 
     echo $this->name; 
    } 
} 

class ClassB extends ClassA { 
    public function getName() { 
     parent::getName(); 
    } 
} 

沒有繼承或實例方法,你需要ClassA的有一個靜態方法

class ClassA { 
    public static function getName() { 
    echo "Rawkode"; 
    } 
} 

---其他文件---

echo ClassA::getName();

如果你只是希望從類的實例調用方法:無論您選擇哪種解決方案的

class ClassA { 
    public function getName() { 
    echo "Rawkode"; 
    } 
} 

---其他文件---

$a = new ClassA(); 
echo $a->getName(); 

,需要require 'ClassA.php

14

如果它們是不同的類,你可以做類似如下:

class A 
{ 
    private $name; 

    public function __construct() 
    { 
     $this->name = 'Some Name'; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 
} 

class B 
{ 
    private $a; 

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

    function getNameOfA() 
    { 
     return $this->a->getName(); 
    } 
} 

$a = new A(); 
$b = new B($a); 

$b->getNameOfA(); 

我在這個例子中做的是首先創建A類的新實例。之後,我創建了一個B類的新實例,我將A的實例傳遞給構造函數。現在B可以使用$this->a訪問A類的所有公共成員。

另請注意,我沒有在B類中實例化A類,因爲這意味着我會緊緊地將兩個類耦合在一起。這使得它很難:

  1. 單元測試B
  2. 換出A類另一類
+0

這個也不錯,但你指定了兩個不同的文件。所以你只需要記住要包含你想用「new B()」實例化的類,等等。 –

+0

我更多地閱讀了這個問題,我怎樣才能訪問另一個類的成員,而不是如何包含一個文件,但是你是對的。儘管自動加載文件是每個人都應該爲了方便imho而做的。 – PeeHaa

+0

是的。雖然在這個階段,我認爲自動加載可能會使學習過程超載......也許。 –

-1

文件1

class ClassA { 

    public $name = 'A'; 

    public function getName(){ 
     return $this->name; 
    } 

} 

文件2

include("file1.php"); 
class ClassB { 

    public $name = 'B'; 

    public function getName(){ 
     return $this->name; 
    } 

    public function callA(){ 
     $a = new ClassA(); 
     return $a->getName(); 
    } 

    public static function callAStatic(){ 
     $a = new ClassA(); 
     return $a->getName(); 
    } 

} 

$b = new ClassB(); 
echo $b->callA(); 
echo $b->getName(); 
echo ClassB::callAStatic(); 
+0

請參閱@我的評論](http://stackoverflow.com/questions/13503734/php-calling-another-class-method/13503805#comment18482402_13503769)在@codingbiz的答案。 – PeeHaa