#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 спасибо, что сделал это 🙂 Небольшая оплошность.