带有受保护数组属性的php继承让我非常头疼
所以我决定用PHP创建一些类,这样我就可以使用带有受保护数组属性的php继承让我非常头疼,php,arrays,inheritance,visibility,protected,Php,Arrays,Inheritance,Visibility,Protected,所以我决定用PHP创建一些类,这样我就可以使用、和标记动态构建菜单栏。原因是我想在项目之间重用它 首先,请注意,我在代码中加入了一些调试信息,因为我实际上是一名.NET开发人员,我还不知道如何进行适当的调试:s <?php // Menu Items <li><a href=\"$target\">$itemName</a></li> class MenuItem { public $order; public $targe
- 、
- 和标记动态构建菜单栏。原因是我想在项目之间重用它
首先,请注意,我在代码中加入了一些调试信息,因为我实际上是一名.NET开发人员,我还不知道如何进行适当的调试:s
之后,$subMenu和$menuBuilder上都有Items属性的转储 浏览器中这些调用的输出完全让我困惑:<?php // Menu Items <li><a href=\"$target\">$itemName</a></li> class MenuItem { public $order; public $target; public $itemName; function __construct($itemName="", $target="", $order=0) { $this->order = $order; $this->target = $target; $this->itemName = $itemName; } public function Build() { //if $target is empty or $itemName is empty then return empty string (both must be present to generate an item) if(strcasecmp($target,"") == 0 || strcasecmp($itemName,"") == 0) { return ""; } return "<li><a href=\"" . $target . "\">" . $itemName . "</a></li>"; } } //<li><a>$FirstMenuItem</i> // Submenu Root Head Item: <li><a href=\"$(optional)Target\">$ItemName</a><ul> // Holds a list of MenuItems and SubmenuRootItems // Submenu Root End Item: </ul> class SubMenu extends MenuItem { protected $itemArray; function __construct($itemName = "", $target = "", $order = 0) { parent::__construct($itemName, $target, $order); $this->itemArray = array(); } public function Items() { return $this->itemArray; } public function AddSubMenuItem ($subMenuItem) { $retval = strcasecmp( get_class ($subMenuItem), "submenu") == 0 ? self::AddItem($subMenuItem) : false; echo"<br>second dump<br>"; var_dump($this->itemArray); echo "<br>"; return $retval; } public function AddMenuItem ($menuItem) { $retval = strcasecmp( get_class ($menuItem), "menuitem") == 0 ? self::AddItem($menuItem) : false; echo"<br>second dump<br>"; //debug code var_dump($this->itemArray); echo "<br>"; //debug code return $retval; } protected function AddItem($item) { $itemArray[$item->itemName] = $item; echo "AddItem <br />"; //ugly debug code var_dump($itemArray); //even more of it return true; } public function Build() { $buildHtml = "<li>"; $buildHtml .= strcasecmp($target, "") == 0 ? "<a>" : "<a href=\"" . $target . "\">"; $buildHtml .= $itemName . "</a><ul>"; $buildHtml .= BuildSubMenu(Items()); $buildHtml .= "</ul></li>"; } public function BuildSubMenu($menuItems) { $buildHtml = ""; echo "for each start". var_dump($menuItems) ; foreach($menuItems as $menuItem) { echo $menuItem; $buildHtml .= $menuItem->Build(); } return $buildHtml; } } // Menu Root Element <ul id=\"menu\"> // holds a list of MenuItems and SubmenuRootItems // Menu Root Closing Element </ul> class MenuBuilder extends SubMenu { function __construct() { parent::__construct(); } public function Build() { echo "<br><br><br>". var_dump($this->itemArray); echo "<br><br><br>".var_dump(parent::$this->itemArray);echo "<br><br><br>";//ugly debug code $buildHtml = "<ul id=\"menu\">"; $buildHtml .= parent::BuildSubMenu($this->itemArray); $buildHtml .= "</ul>"; return $buildHtml; } } ?>
Create menuBuilder...Done! Create subMenu1...Done! Execute subMenu1->AddMenuItem...AddItem array(1) { ["Menu Item 1.1"]=> object(MenuItem)#4 (3) { ["order"]=> int(0) ["target"]=> string(4) "#1.1" ["itemName"]=> string(13) "Menu Item 1.1" } } second dump array(0) { } Done! Create menuItem2...Done! Execute menuBuilder->AddSubMenuItem...AddItem array(1) { ["Sub Menu 1"]=> object(SubMenu)#3 (4) { ["itemArray":protected]=> array(0) { } ["order"]=> int(0) ["target"]=> string(0) "" ["itemName"]=> string(10) "Sub Menu 1" } } second dump array(0) { } Done! Execute menuBuilder->AddMenuItem...AddItem array(1) { ["Menu Item 2"]=> object(MenuItem)#4 (3) { ["order"]=> int(0) ["target"]=> string(2) "#2" ["itemName"]=> string(11) "Menu Item 2" } } second dump array(0) { } Done!
因此AddItem函数起作用,一个项被添加到$itemArray中,并且它被成功转储。然后当函数返回到它的调用者“AddMenuItem”并且我再次转储相同的$itemArray时,它是空的吗?我真的不明白它是如何工作的:s也许您不会更改AddItem方法中的class itemArray属性 你有这个:protected function AddItem($item) { $itemArray[$item->itemName] = $item; echo "AddItem <br />"; //ugly debug code var_dump($itemArray); //even more of it return true; }
试试这个:protectedfunction AddItem($item){ $itemArray[$item->itemName]=$item; echo“AddItem
”;//丑陋的调试代码 var_dump($itemArray);//甚至更多 返回true; }protected function AddItem($item) { // $this will change the class property :) $this->itemArray[$item->itemName] = $item; echo "AddItem <br />"; //ugly debug code var_dump($this->itemArray); //even more of it return true; }
在许多地方,如MenuItem->Build方法中,您不会使用$this:protectedfunction AddItem($item){ //$this将更改类属性:) $this->itemArray[$item->itemName]=$item; echo“AddItem
”;//丑陋的调试代码 var_dump($this->itemArray);//甚至更多 返回true; }class MenuItem { public $order; public $target; public $itemName; function __construct($itemName="", $target="", $order=0) { $this->order = $order; $this->target = $target; $this->itemName = $itemName; } public function Build() { // The $target and $itemName variables aren't inicialized //if $this->target is empty or $this->itemName is empty then return empty string (both must be present to generate an item) if(strcasecmp($this->target,"") == 0 || strcasecmp($this->itemName,"") == 0) { return ""; } return "<li><a href=\"" . $this->target . "\">" . $this->itemName . "</a></li>"; } }
也许您不会更改AddItem方法中的class itemArray属性 你有这个:类菜单项{ 公共秩序; 公帑目标;; 公共$itemName; 函数_构造($itemName=“”、$target=“”、$order=0){ $this->order=$order; $this->target=$target; $this->itemName=$itemName; } 公共功能构建(){ //$target和$itemName变量没有被取消标记 //如果$this->target为空或$this->itemName为空,则返回空字符串(两者都必须存在才能生成项目) 如果(strcasecmp($this->target,“”)==0 | | strcasecmp($this->itemName,“”)==0){ 返回“”; } 返回“”; } }
protected function AddItem($item) { $itemArray[$item->itemName] = $item; echo "AddItem <br />"; //ugly debug code var_dump($itemArray); //even more of it return true; }
试试这个:protectedfunction AddItem($item){ $itemArray[$item->itemName]=$item; echo“AddItem
”;//丑陋的调试代码 var_dump($itemArray);//甚至更多 返回true; }protected function AddItem($item) { // $this will change the class property :) $this->itemArray[$item->itemName] = $item; echo "AddItem <br />"; //ugly debug code var_dump($this->itemArray); //even more of it return true; }
在许多地方,如MenuItem->Build方法中,您不会使用$this:protectedfunction AddItem($item){ //$this将更改类属性:) $this->itemArray[$item->itemName]=$item; echo“AddItem
”;//丑陋的调试代码 var_dump($this->itemArray);//甚至更多 返回true; }class MenuItem { public $order; public $target; public $itemName; function __construct($itemName="", $target="", $order=0) { $this->order = $order; $this->target = $target; $this->itemName = $itemName; } public function Build() { // The $target and $itemName variables aren't inicialized //if $this->target is empty or $this->itemName is empty then return empty string (both must be present to generate an item) if(strcasecmp($this->target,"") == 0 || strcasecmp($this->itemName,"") == 0) { return ""; } return "<li><a href=\"" . $this->target . "\">" . $this->itemName . "</a></li>"; } }
我忘记提到的是最终目标。我希望从代码和示例中可以清楚地看到这一点。最终目标是让我的$menuBuilder实例,动态添加项,并在最后调用build方法以获取我的HTML代码。创建了Poof菜单:)类菜单项{ 公共秩序; 公帑目标;; 公共$itemName; 函数_构造($itemName=“”、$target=“”、$order=0){ $this->order=$order; $this->target=$target; $this->itemName=$itemName; } 公共功能构建(){ //$target和$itemName变量没有被取消标记 //如果$this->target为空或$this->itemName为空,则返回空字符串(两者都必须存在才能生成项目) 如果(strcasecmp($this->target,“”)==0 | | strcasecmp($this->itemName,“”)==0){ 返回“”; } 返回“”; } }
不是$itemArray
我忘记提到的是最终目标。我希望从代码和示例中可以清楚地看到这一点。最终目标是让我的$menuBuilder实例,动态添加项,并在最后调用build方法以获取我的HTML代码。Poof菜单已创建:)$this->itemArray
不是$itemArray
change$this->itemArray
参数。在其他几个地方,它看起来也缺少$this。它确实解决了这个问题,但似乎我不得不在很多项目上使用$this->操作符。我一起删除了var_转储,我只是插入它们来获得一些额外的调试信息。我现在确实得到了一些没有崩溃的输出,但它还不正确。“$itemArray”应包含作为菜单项的两个子菜单项。我想创建的结构应该是一个带有子菜单的菜单,子菜单可以包含更多的子菜单或项目。项目也应该能够成为菜单的一个叶子。递归调用呢?php能处理这些问题吗?因为我递归调用“BuildSubMenu”,而他应该处理的项不在我的输出中。(我当前的输出是:var\u dump