我现在遇到麻烦,我正试图从Wolf类的方法访问Dog类的其他方法。这就是代码:
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();
class Wolf {
private $_name;
public function __construct($name){
$this->_name = $name;
}
public function hunt(){
return $dog->setLife(0);
}
}
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()
我花了两天时间搜索,但仍无法修复。 谢谢你,抱歉我的英语不好。
答案 0 :(得分:0)
你应该做的是用狩猎方法传递$ dog,如下所示:
public function hunt(Dog $dog){
return $dog->setLife(0);
}
您可以验证dog变量是否为期望类的实例。 这种传递对象的方法称为依赖注入。
如果你想传递各种各样的动物,你需要使用另一个叫做继承的概念:
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);
}
}
请注意,常用方法和变量存在于父类中,您可以根据需要创建与动物类型相同的类型。
如果您遵循此示例,您应该找到一种在Animal类中声明动物名称变量的方法,这样您就不必在所有子类中重新定义它;)
答案 1 :(得分:0)
替换
$dog->setLife(0);
通过
Dog::setLife(0);