Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有受保护数组属性的php继承让我非常头疼_Php_Arrays_Inheritance_Visibility_Protected - Fatal编程技术网

带有受保护数组属性的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

所以我决定用PHP创建一些类,这样我就可以使用
  • 和标记动态构建菜单栏。原因是我想在项目之间重用它

    首先,请注意,我在代码中加入了一些调试信息,因为我实际上是一名.NET开发人员,我还不知道如何进行适当的调试:s

    <?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;
        }
    }
    ?>
    
    之后,$subMenu和$menuBuilder上都有Items属性的转储

    浏览器中这些调用的输出完全让我困惑:

    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;
    }
    
    protectedfunction AddItem($item){
    //$this将更改类属性:)
    $this->itemArray[$item->itemName]=$item;
    echo“AddItem
    ”;//丑陋的调试代码 var_dump($this->itemArray);//甚至更多 返回true; }
    在许多地方,如MenuItem->Build方法中,您不会使用$this:

    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>";
    }
    }
    
    类菜单项{
    公共秩序;
    公帑目标;;
    公共$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){
    返回“”;
    }
    返回“
  • ”; } }
    也许您不会更改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;
    }
    
    protectedfunction AddItem($item){
    //$this将更改类属性:)
    $this->itemArray[$item->itemName]=$item;
    echo“AddItem
    ”;//丑陋的调试代码 var_dump($this->itemArray);//甚至更多 返回true; }
    在许多地方,如MenuItem->Build方法中,您不会使用$this:

    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>";
    }
    }
    
    类菜单项{
    公共秩序;
    公帑目标;;
    公共$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){
    返回“”;
    }
    返回“
  • ”; } }
    我忘记提到的是最终目标。我希望从代码和示例中可以清楚地看到这一点。最终目标是让我的$menuBuilder实例,动态添加项,并在最后调用build方法以获取我的HTML代码。创建了Poof菜单:)
    $itemArray
    不是
    $this->itemArray
    我忘记提到的是最终目标。我希望从代码和示例中可以清楚地看到这一点。最终目标是让我的$menuBuilder实例,动态添加项,并在最后调用build方法以获取我的HTML代码。Poof菜单已创建:)
    $itemArray
    不是
    $this->itemArray
    change
    var\u dump
    参数。在其他几个地方,它看起来也缺少$this。它确实解决了这个问题,但似乎我不得不在很多项目上使用$this->操作符。我一起删除了var_转储,我只是插入它们来获得一些额外的调试信息。我现在确实得到了一些没有崩溃的输出,但它还不正确。“$itemArray”应包含作为菜单项的两个子菜单项。我想创建的结构应该是一个带有子菜单的菜单,子菜单可以包含更多的子菜单或项目。项目也应该能够成为菜单的一个叶子。递归调用呢?php能处理这些问题吗?因为我递归调用“BuildSubMenu”,而他应该处理的项不在我的输出中。(我当前的输出是:
    • )很抱歉发送垃圾邮件,但我的预期输出是:
        • 更改
          var\u dump
          参数,看起来$this在其他几个地方丢失了。它确实解决了这个问题,但似乎我不得不在很多项目上使用$this->操作符。我一起删除了var_转储,我只是插入它们来获得一些额外的调试信息。我现在确实得到了一些没有崩溃的输出,但它还不正确。“$itemArray”应包含作为菜单项的两个子菜单项。我想创建的结构应该是一个带有子菜单的菜单,子菜单可以包含更多的子菜单或项目。项目也应该能够成为菜单的一个叶子。递归调用呢?php能处理这些问题吗?因为我递归调用“BuildSubMenu”,而他应该处理的项不在我的输出中。(我当前的输出
          )很抱歉发送垃圾邮件,但在我的情况下,预期的输出是: