Неопределенное свойство . Не удается вызвать атрибуты объекта на другой странице

#php #model-view-controller

#php #модель-представление-контроллер

Вопрос:

Я начинаю разрабатывать простое MVC-приложение. Я вызываю функцию ниже в моем контроллере

 public function show()
    {
        if (!isset($_GET['id']))
            return call('pages', 'error');
        $ingredient = Ingredients::find($_GET['id']);
        require_once('views/ingredients/show.php');
    }
  

Я не могу получить доступ к таким $ingredient атрибутам объектов, как $ingredient->item_id или любым атрибутам в show.php . Но способен вызывать атрибуты объектов внутри одной и той же функции.

Мой show.php страница выглядит следующим образом

 <p>This is the requested Ingredients:</p>

<p><?php echo $ingredient->item_id; ?></p>
<p><?php echo $ingredient->stock_id; ?></p>
<p><?php echo $ingredient->item_qunatity; ?></p>
<p><?php echo $ingredient->item_unit; ?></p>  

Моя модель выглядит следующим образом. Имя этого класса — Ingredients

public static function find($id) {
$database = Database::getInstance();
$id = intval($id);
$query = $database->prepare('SELECT * FROM ingredients WHERE id = :id');
$query->execute(array('id' => $id));
$ingredient = $query->fetch();
return new Ingredients($ingredient['id'],$ingredient['item_id'],$ingredient['stock_id'], $ingredient['item_quantity'],$ingredient['item_unit']);
}

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

1. вызываете ли вы функцию show () перед печатью $ingredient?

2. ДА. Я вызывал функцию ранее . Это происходит, если я сохраняю в переменной внутри функции и печатаю переменную в show.php вместо этого .

3. После получения данных из $ingredient = Ingredients::find($_GET[‘id’]); , дамп $ingredient , дает ли это все значение? дайте мне знать

4. Вы используете теги как для cakephp, так и для codeigniter-3. Вы как-то смешиваете эти два фреймворка?

5. Что именно Ingredients::find() возвращает?

Ответ №1:

Проблема здесь в том, что вы определяете эти функции в области одного метода, в то время как пытаетесь получить к ним доступ в области другого метода. Это две разные вещи.

Чтобы выполнить что-то подобное, вам нужно либо объявить переменную в глобальной области видимости (считается плохой практикой), либо сохранить ее внутри свойств объектов.