在非对象上调用成员函数出错


Calling to a member function on a non-object Error

我在尝试从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);