2014-09-06 88 views
0

我遇到了麻煩,現在我試圖從一個Wolf類的方法訪問Dog類的其他方法。這是代碼:調用一個非對象的成員函數錯誤

的index.php

require_once 'Wolf.php'; 
    require_once 'Dog.php'; 

    class StackOverflowExample{ 
     public static function run(){ 
      $dog = new Dog("Cokey"); 
      $wolf = new Wolf("Wolfenstein"); 

      $wolf->hunt(); 
     } 
    } 
    StackOverflowExample::run(); 

Wolf.php

class Wolf { 

    private $_name; 

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

    public function hunt(){ 
     return $dog->setLife(0); 
    } 

} 

Dog.php

class Dog { 
    private $_name; 
    private $_life= 100; 

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

    public function setLife($life){ 
     $this->_life = $life; 
    } 

    public function getLife(){ 
     return $this->_life; 
    } 
} 

它給我的下一個錯誤: ·未定義的變量:狗 ·調用一個非對象的成員函數setLife()

我花了兩天的時間搜索,我仍然無法修復。 謝謝你,對不起我的英文不好。

+1

$的狗是不是一個全局變量,你訪問它在Wolf.php W/O初始化 – MrTux 2014-09-06 17:00:13

回答

0

你應該做的是通過周圍$狗,在狩獵方法,像這樣:

public function hunt(Dog $dog){ 
    return $dog->setLife(0); 
} 

你得到驗證,狗變量是預期的類的實例的能力。 這種傳遞對象的方法稱爲依賴注入。

如果你想繞過各種動物的,你需要使用另一個概念稱爲繼承:

abstract class Animal 
{ 
    public $_life; 

    public function setLife($life){ 
     $this->_life = $life; 
    } 

    public function getLife(){ 
     return $this->_life; 
    } 

} 

class Dog extends Animal 
{ 
    private $_name; 

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

class Wolf { 

    private $_name; 

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

    public function hunt(Animal $animal){ 
     return $animal->setLife(0); 
    } 

} 

注意的常用方法和變量住在父類,並且您可以創建許多隻要你想要的動物類型。

如果按照這個例子中,你應該找到一種方法來聲明動物的名字變量在動物類,所以你不必重新定義它在所有子類;)

+0

如果我想從許多不同類別的傳遞對象是什麼? – suarsenegger 2014-09-07 02:20:54

0

更換

$dog->setLife(0); 

通過

Dog::setLife(0); 
相關問題