我在尝试从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;
}
}
它给了我下一个错误:·未定义的变量:dog·在非对象上调用成员函数setLife()
我花了两天时间寻找,但仍然没有办法修复。谢谢你,为我糟糕的英语感到抱歉。
您应该做的是在hunt方法中传递$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类中声明动物的名称变量,这样你就不必在所有子类中重新定义它;)
更换
$dog->setLife(0);
通过
Dog::setLife(0);