Вызов функции-члена в строке (но функция возвращает строку) PHP

#php #string

#php #строка

Вопрос:

Я создаю скрипт меню для оптимизации разработки моего веб-сайта, но я столкнулся с проблемой. Ни одна статья, которую я просматривал, SO или нет, не была полезной. По сути, предполагается, что этот скрипт состоит из нескольких пользовательских «кнопок» ( class Button ) внутри Menu ( class Menu ).

Fatal error: Uncaught Error: Call to a member function get_button() on string in F:ImagineYouth Group ConnectSitephpMenu.php:17 Stack trace: #0 F:ImagineYouth Group ConnectSiteuserslogin.php(148): Menu->get() #1 {main} thrown in F:ImagineYouth Group ConnectSitephpMenu.php on line 17

Функция get_button() возвращает строку, так что кто-нибудь знает, почему PHP выдает эту ошибку? Вот из Menu.php :

 <?php
// A simple menu builder with options :)

class Menu {
    public $ID;
    public $Buttons = array();
    
    // Adds the button object to the array
    public function Add_Button($btn) {
        array_push($this->Buttons, $btn);
    }
    
    // Returns the string to be echoed inside the html
    public function get() {
        $starter = "<nav id='$this->ID'><ul>";
        
        // loops through each button
        for ($x = 0; $x < count($this->Buttons); $x  ) {
            $btn = $this->Buttons[$x];
            $starter .= $btn->get_button(); // <-- Here is where the error is being thrown
            /*
            Fatal error: Uncaught Error: Call to a member function get_button() 
            on string in F:ImagineYouth Group ConnectSitephpMenu.php:17 Stack trace
            : #0 F:ImagineYouth Group ConnectSiteuserslogin.php(148): Menu->get() #1 
            {main} thrown in F:ImagineYouth Group ConnectSitephpMenu.php*/
        }
        
        $starter .= "</ul></nav>";
        return $starter;
    }
    
    public function __construct($id) {
        $this->ID = $id;
    }
}

class Button {
    public $link;
    public $text;
    // Whether is the "primary" button or not... I know terrible naming
    public $isBig = false;
    public $subMenu = array();
    
    public function get_button() {
        if ($this->isBig) {
            return "<li><a href='$this->link' class='button primary'>$this->text</a></li>";
        } else if (count($this->subMenu) < 1) {
            return "<li><a href='$this->link'>$this->text</a></li>";
        } else {
            $fullText = "<li><a href='$this->link'>$this->text</a><ul>";
            
            foreach ($this->subMenu as $btn) {
                $fullText .= "<li><a href='$btn->link'>$btn->text</a></li>";
            }
            
            $fullText .= "</ul></li>";
            return $fullText;
        }
    }
    
    public function __construct($link, $text) {
        $this->link = $link;
        $this->text = $text;
    }
    
    // Adds sub-menu items to the button
    public function add_sub_item($link, $text) {
        $this->isBig = false;
        array_push($this->subMenu, new Button($link, $text));
    }
}
?>
  

И затем вот login.php откуда я это вызываю.

 $menu = new Menu("nav");
$menu->Add_Button(new Button("../index.html", "Home"));

$dropDown = new Button("#", "Download");
$dropDown->add_sub_item("#", "iTunes");
$dropDown->add_sub_item("#", "Play Store");
$dropDown->add_sub_item("#", "Other");

$menu->Add_Button($dropDown);
$menu->Add_Button("#", "Features");

$bigButton = new Button("login.php", "Login/Register");
$bigButton->isBig = true;

$menu->Add_Button($bigButton);
echo $menu->get();
  

Комментарии:

1. $btn в этой строке находится строка. Это означает, что все, что вы передали Add_Button , тоже должно было быть одним. Примечание: вы должны опубликовать свой код непосредственно здесь (как можно более сокращенный), вместо публикации вставки. Это не такой длинный фрагмент.

2. @Jeto я отредактирую с помощью кода вставки и кода, вызывающего это тоже.

3. $menu->Add_Button("#", "Features"); <- ну вот, вы добавляете туда строку. Вы, вероятно, хотите $menu->Add_Button(new Button("#", "Features")); вместо этого.

4. @Jeto спасибо, что сделал это 🙂 Небольшая оплошность.