2010-05-19 61 views
6

所以,我有兩個類是這樣的:PHP訪問類

class foo { 
    /* code here */ 
} 
$foo = new foo(); 
class bar { 
    global $foo; 
    public function bar() { 
     echo $foo->something(); 
    } 
} 

我要訪問的所有方法吧內foo的方法,不需要在裏面吧每個方法聲明,就像這樣:

class bar { 
    public function bar() { 
     global $foo; 
     echo $foo->something(); 
    } 
    public function barMethod() { 
     global $foo; 
     echo $foo->somethingElse(); 
    } 
    /* etc */ 
} 

我也不想延長它。我嘗試使用var關鍵字,但似乎沒有工作。爲了在bar的所有方法中訪問其他類「foo」,我該怎麼做?

回答

7

你可以做這樣太:

class bar { 
    private $foo = null; 

    function __construct($foo_instance) { 
     $this->foo = $foo_instance; 
    } 

    public function bar() { 
     echo $this->foo->something(); 
    } 
    public function barMethod() { 
     echo $this->foo->somethingElse(); 
    } 
    /* etc, etc. */ 
} 

後來你可以這樣做:

$foo = new foo(); 
$bar = new bar($foo); 
+0

從未考慮過將它作爲參數傳遞;它現在有效。謝謝! – 2010-05-19 02:15:17

+0

@arxanas:歡迎您:) – Sarfraz 2010-05-19 02:17:30

+3

僅供參考,即衆所周知的依賴注入 – 2010-05-19 02:26:19

4

讓它成爲酒吧的一員。儘量不要使用全局變量。

class bar { 
    private $foo; 

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

    public function barMethod() { 
     echo $this->foo->something(); 
    } 
} 
2

簡短的回答:沒有,沒有辦法實現你想要什麼。

另一個簡短的答案是:你正在以「錯誤」的方式處理類。一旦你選擇了面向對象的範例 - 忘記「全局」關鍵字。

做你想做什麼的正確方法是創建一個foo的實例作爲bar的成員並使用它的方法。這叫做delegation

0

一個選項是自動載入你的課程。此外,如果你讓你的類的靜態類,你可以把它叫做無$classname = new classname()

//Autoloader 
spl_autoload_register(function ($class) { 
$classDir = '/_class/'; 
$classExt = '.php'; 
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; 
}); 

//Your code 
class bar { 
    private static $foo = null; //to store the class instance 

    public function __construct(){ 
     self::$foo = new foo(); //stores an instance of Foo into the class' property 
    } 

    public function bar() { 
     echo self::$foo->something(); 
    } 
} 

如果您將您的類(富)爲靜態類

//Autoloader 
spl_autoload_register(function ($class) { 
$classDir = '/_class/'; 
$classExt = '.php'; 
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; 
}); 

//Your code 
    class bar { 
     public function bar() { 
      echo foo::something(); 
     } 
    } 
1

如果你唯一的焦點該方法本身與另一個類的實例相反,您可以使用x extends y

class foo { 
    function fooMethod(){ 
    echo 'i am foo'; 
    } 
} 

class bar extends foo { 
    function barMethod(){ 
    echo 'i am bar'; 
    } 
} 

$instance = new bar; 
$instance->fooMethod();