PHP接口编码

PHP接口编码,php,interface,Php,Interface,我有一个PHP接口编码问题。我从《Head First Design Patterns》一书中获取java代码,并将其转换为下面的代码。我使用的是MAMP/PHP5.6.2和NetBeans 8.1 我正在尝试在扩展抽象类(MenuComponent)的菜单类中实现接口“TestInterface”。菜单类不会以“TestInterface”实现开始。当我在菜单类声明中注释掉“TestInterface”时,代码将运行,如下所示。而“TestInterface”被注释掉后,PHP即使在声明接口并

我有一个PHP接口编码问题。我从《Head First Design Patterns》一书中获取java代码,并将其转换为下面的代码。我使用的是MAMP/PHP5.6.2和NetBeans 8.1

我正在尝试在扩展抽象类(MenuComponent)的菜单类中实现接口“TestInterface”。菜单类不会以“TestInterface”实现开始。当我在菜单类声明中注释掉“TestInterface”时,代码将运行,如下所示。而“TestInterface”被注释掉后,PHP即使在声明接口并将接口函数保留为菜单成员函数时也不会抛出错误。我已经成功地运行了更简单的代码,同时使用上述相同的平台进行了扩展和实现。由于使用了更简单的代码,我相信我遇到了结构或语法错误下面是我的代码。我希望有人能帮我找到我做错了什么。提前谢谢

<?php

$run = new myclass;
$run->main();

class myclass {

   private $pancakeHouseMenu;
   private $allMenus;
   private $waitress;

   public function main(){

        echo "<br />hi main!<br />";

        $this->pancakeHouseMenu = new Menu("PANCAKE HOUSE MENU", "Breakfast");

        $this->allMenus = new Menu("ALL MENUS", "All menus combind");

        $this->allMenus->add($this->pancakeHouseMenu);

        $this->pancakeHouseMenu->add(new MenuItem(

            "Regular Pancake Breakfast",
            "Pancakes with eggs and sausage"));

        $this->waitress = new Waitress($this->allMenus);

        $this->waitress->printMenu(); 

    }

}

interface TestInterface {

    public function interfaceTest();


}

abstract class MenuComponent {

    public function add(MenuComponent $newMenuComponent) {

            throw new InvalidArgumentException("Exception thrown");

    }

    public function getName() {

            throw new InvalidArgumentException("Exception thrown");

    }

    public function getDescription() {

            throw new InvalidArgumentException("Exception thrown");

    }

    public function printOut() {

            throw new InvalidArgumentException("Exception thrown");

    }

}

class Waitress {

    private $allMenus;

    public function __construct(MenuComponent $allMenus) {

        $this->allMenus = $allMenus;
        $this->allMenus->add($allMenus);

    }

    public function printMenu() {

        $this->allMenus->printOut();

    }

}

class MenuItem extends MenuComponent {

    private $name;
    private $description;

    public function __construct($name, $description) {

        $this->name = $name;
        $this->description = $description;

    }

    public function getName() {

        return $this->name;

    }

    public function getDescription() {

        return $this->description;

    }

    public function printOut() {

        print(" " . $this->getName());   
        print("  -- " . $this->getDescription());

    }

}

class Menu extends MenuComponent /*** implements TestInterface ***/ {

    private $menuComponents = array();
    private $name;
    private $description;
   // private $testVar;

    public function __construct($name, $description) {

       $this->name = $name;
       $this->description = $description;
       $this->testVar = "Interface test succeeded";

    }

     public function interfaceTest(){

        return $this->testVar;

    }

    public function add(MenuComponent $newMenuComponent) {

        array_push($this->menuComponents, $newMenuComponent);

    }

    public function getName() {

       return $this->name;

    }

    public function getDescription() {

        return $this->description;

    }

    public function printOut() {

        print("<br />" . $this->getName());
        print(", " . $this->getDescription());
        print("<br />---------------------");
        print("<br />Testing interface var: ". $this->interfaceTest());

    }

}

?>

在您的代码中,您在类声明上方创建了一个对象。如果您的类没有实现任何接口,这似乎是可以的。由于您的类
菜单
实现了接口
TestInterface
,PHP在声明类之前不接受您的对象实例化。

解决方案非常简单,将对象创建的
myclass
放在对象声明下面:

<?php
class myclass {

    private $pancakeHouseMenu;
    private $allMenus;
    private $waitress;

    ...

    public function getDescription() {

          return $this->description;

     }

     public function printOut() {

          print("<br />" . $this->getName());
          print(", " . $this->getDescription());
          print("<br />---------------------");
          print("<br />Testing interface var: ". $this->interfaceTest());

     }

}

$run = new myclass;
$run->main();

?>

在您的代码中,您在类声明上方创建了一个对象。如果您的类没有实现任何接口,这似乎是可以的。由于您的类
菜单
实现了接口
TestInterface
,PHP在声明类之前不接受您的对象实例化。

解决方案非常简单,将对象创建的
myclass
放在对象声明下面:

<?php
class myclass {

    private $pancakeHouseMenu;
    private $allMenus;
    private $waitress;

    ...

    public function getDescription() {

          return $this->description;

     }

     public function printOut() {

          print("<br />" . $this->getName());
          print(", " . $this->getDescription());
          print("<br />---------------------");
          print("<br />Testing interface var: ". $this->interfaceTest());

     }

}

$run = new myclass;
$run->main();

?>


请添加与此相关的菜单类(以及界面)请添加与此相关的菜单类(以及界面)是什么相关的)嘿,史蒂文,非常感谢。这个问题是php作为一种解释语言的结果吗?如果我没有误认为Java是一种编译语言,那么我可能不会有Java的这种结构问题;我是对的吗?现在我正在运行您上面演示的程序,我意识到我的问题是php是一种解释语言。可能是一个愚蠢的问题。但无论如何,请发表评论,因为我不喜欢因为害怕愚蠢而不问。我感谢你的专业知识。再次感谢史蒂文。嘿,史蒂文,非常感谢你。这个问题是php是一种解释语言的结果吗?如果我没有误解Java是一种编译语言的话,也是如此我可能不会有Java的这种结构问题;我是对的吗?现在我正在运行程序,正如你在上面向我展示的那样,我意识到我关于php是解释语言的问题可能是一个愚蠢的问题。但是请评论一下,因为我不喜欢因为害怕愚蠢而不问。我感谢你的专业知识。Tha又来了,史蒂文。