【问题标题】:Abstract Classes in PHP throwing errorPHP中的抽象类抛出错误
【发布时间】:2013-09-14 14:49:32
【问题描述】:

我一直低于测试脚本,但我不确定为什么会给我错误。但同时按预期工作(输出文本“woof”);

abstract class Animal { 

abstract function bark(); 
  function MakeDog(){
        return $this->bark();
  } 

} 

class Dog extends Animal { 
  function bark(){
    echo 'Woof';
  }
} 


$dog = new Dog(); 
echo $dog->MakeDog()->bark(); // this outputs 'woof' but with error. 


Fatal error: Call to a member function bark() on a non-object in [...] 26 

第 26 行是//echo $dog->MakeDog()->bark(); 我不确定错误与什么有关。

【问题讨论】:

  • 提示:看看bark函数的返回值。
  • return 甚至没有回显文本,所以我怀疑它来自返回值/
  • 我不是这个意思。在MakeDog 中,您返回bark 的返回值,但是bark() 不包含return 语句,因此隐式返回NULL。然后您尝试在NULL 上再次调用bark()(因为这是makeDog 返回的内容),这会导致给定的错误消息。

标签: php oop methods abstract-class


【解决方案1】:

你不能在方法MakeDog()之后调用bark(),也不能使用echo来返回消息,为此使用“return”,正确的代码:

<?php

abstract class Animal { 

    abstract function bark(); 

    public function MakeDog(){
        return $this->bark();
    } 

} 

class Dog extends Animal { 

    function bark(){
        return 'Woof';
    }

} 

$dog = new Dog(); 

echo $dog->MakeDog();

?>

【讨论】:

  • 如果我想这样称呼它echo $dog-&gt;MakeDog()-&gt;bark();怎么办?
  • 您好,唯一的方法是如果方法“MakeDog”返回类的实例,我鼓励您阅读“Singleton”,这很简单。
  • 感谢您的回答,但我确信有一种方法可以在不点击单例的情况下实现这一目标。我只是无法弄清楚这一点。
  • 您可以在 MakeDog 方法上返回 $this 并以这种方式调用 echo $dog->MakeDog()->bark();
  • 完美,正是我想要的
【解决方案2】:

也许你甚至不需要回应。这应该工作

$dog = new Dog();
$dog->MakeDog()->bark();

另外,摆脱return 只需在MakeDog 函数中调用bark()

function MakeDog() {
    $this->bark();    
}

【讨论】:

    【解决方案3】:

    不应该只是:

    $dog = new Dog();
    echo $dog->MakeDog();
    

    你的 MakeDog 函数已经执行了 bark() 方法。

    【讨论】:

    • 不,我需要将树皮附加到 MakeDog() 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多