Невозможно получить доступ к переменной из базы .php, вызываемой требуемым php

предположим, что у меня есть код, как показано ниже:

index.php

<?php
    require 'file_1.php';

    // file_1.php contents can go here, but i'm trying to make this simple and clutter free, thus clean. 
    // The reason being to not centralize all code in a single file should file_2.php, file_3.php, file_n.php exist.

    $app = new type_of_object();
    $app->intialize_some_stuff();
?>

файл_1.php

<?php
    $app->access_some_method($param1, new function($app) {
        // do some logic here...
    });
?>

при таком подходе я получаю сообщение об ошибке, как показано ниже:

Notice: Undefined variable: app in X:\project_folder\file_1.php on line 2

Подводя итог, я пытаюсь децентрализовать все коды, чтобы они не определялись в index.php, и вместо этого размещать их в разных файлах, таких как file_1.php в file_n.php. Проблема в том, что мне нужно будет получить доступ к переменной $app из index.php в файлах требуется, таких как file_1.php в file_n.php, поскольку мне понадобится только 1 экземпляр этого, дубликаты не допускаются.

Я также открыт для обучения другому подходу к этому.

ваше здоровье!

Обновлено: ничего не стоит то, что я новичок в PHP и что я уже провел мало исследований. за исключением того, что то, что я получаю, противоположно моей проблеме. Кроме того, необходимость доступа к $app из index.php из других php-файлов находится в самом центре моего вопроса.

@RodenerDajes, можете ли вы предоставить мне более подробную информацию об этом? Кроме того, могу ли я передать $app из index.php другим файлам php с помощью этого?

Nii 07.04.2019 18:28

Вам нужно создать экземпляр объекта, прежде чем вы сможете его использовать. Вы делаете наоборот — сначала включаете file_1.php, который содержит код, предполагающий, что объект $app был создан. Однако на самом деле вы не создаете объект до тех пор, пока не появится include.

Darragh Enright 07.04.2019 18:31

В качестве совета вы можете include файл после создания экземпляра, но на самом деле в этом нет никакой пользы. Я бы подумал о переносе экземпляра во включенный файл, если он является частью какой-то общей функциональности.

Darragh Enright 07.04.2019 18:33

@DarraghEnright я переместил require 'file_1.php после $app = new type_of_object(), и это великолепно сработало. я не знал, что этот синтаксис можно разместить где угодно в коде, я думал, что он должен просто оставаться в верхней части.

Nii 07.04.2019 18:50

@DarraghEnright да, это решило мою проблему. Вы также можете объяснить мне, почему в этом нет никакой пользы? Я хотел бы узнать об этом больше, чтобы использовать его в качестве справочного материала для будущих проектов :)

Nii 07.04.2019 18:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разделение кода может быть хорошей идеей для достижения лучшей ремонтопригодности. Вы должны избегать непонятных имен скриптов.

в первую очередь, вы хотите придерживаться подхода композитор для поддержки пакетов.

В любом случае, для базового разделения кода правила такие же, как и для обычного скрипта. Код интерпретируется во время его чтения. Просто перепишите свой пример в один скрипт:

<?php
    $app->access_some_method($param1, new function($app) {
        // do some logic here...
    });

    $app = new type_of_object();
    $app->intialize_some_stuff();
?>

Видишь проблему? $app просто не инициализируется при вызове access_some_method.

Итак, это будет работать:

<?php
    $app = new type_of_object();
    $app->intialize_some_stuff();
    require 'file_1.php';
?>

Но выигрыш плохой. Если у вас уже есть класс, есть несколько случаев, когда может быть интересно разделить логику между несколькими файлами. Я думаю, что это лучший пример (все файлы в одной папке, без пространств имен):

<?php
   require('App');
   require('AppRequest');

   $app = new App();
   $request = new AppRequest();
   $app->process($request);

Таким образом, вы можете разделить основную логику приложения и логику анализа запроса, например.

привет, спасибо за ваш ответ. Я действительно не привык к тому факту, что PHP является интерпретируемым языком, поскольку большую часть времени я фактически использую C#. ваш ответ определенно ответил на мою проблему. однако, для последней рекомендации. я до сих пор не понимаю, как $app->process($request); будет работать, и его гипотетический контент будет ссылаться на экземпляр $app внутри функции. Я довольно новичок в PHP, и я хотел бы узнать много вещей, включая это в первую очередь. но опять же спасибо! :)

Nii 07.04.2019 18:56

только если возможно, не могли бы вы также поделиться содержимым классов App() и AppRequest(), включая метод ->process($request);. это может быть pastebin или любой другой онлайн-инструмент для вставки. я хотел бы использовать это как основу, а также ссылку для других новых разработчиков PHP.

Nii 07.04.2019 19:00

Пожалуйста. Пример был фейком только для демонстрации какой-то логики. Вы можете взглянуть на phptherightway.com, чтобы копать дальше, когда начинаете PHP. Основная идея заключается в создании процессов «специалистов» через классы, которые будут инстанцироваться основным скриптом по мере необходимости.

Bertrand 08.04.2019 00:13

Другие вопросы по теме