调用非对象错误的成员函数

时间:2014-09-06 16:58:45

标签: php oop methods

我现在遇到麻烦,我正试图从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()

我花了两天时间搜索,但仍无法修复。 谢谢你,抱歉我的英语不好。

2 个答案:

答案 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);