предположим, что у меня есть код, как показано ниже:
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-файлов находится в самом центре моего вопроса.
Вам нужно создать экземпляр объекта, прежде чем вы сможете его использовать. Вы делаете наоборот — сначала включаете file_1.php
, который содержит код, предполагающий, что объект $app
был создан. Однако на самом деле вы не создаете объект до тех пор, пока не появится include
.
В качестве совета вы можете include
файл после создания экземпляра, но на самом деле в этом нет никакой пользы. Я бы подумал о переносе экземпляра во включенный файл, если он является частью какой-то общей функциональности.
@DarraghEnright я переместил require 'file_1.php
после $app = new type_of_object()
, и это великолепно сработало. я не знал, что этот синтаксис можно разместить где угодно в коде, я думал, что он должен просто оставаться в верхней части.
@DarraghEnright да, это решило мою проблему. Вы также можете объяснить мне, почему в этом нет никакой пользы? Я хотел бы узнать об этом больше, чтобы использовать его в качестве справочного материала для будущих проектов :)
Разделение кода может быть хорошей идеей для достижения лучшей ремонтопригодности. Вы должны избегать непонятных имен скриптов.
в первую очередь, вы хотите придерживаться подхода композитор для поддержки пакетов.
В любом случае, для базового разделения кода правила такие же, как и для обычного скрипта. Код интерпретируется во время его чтения. Просто перепишите свой пример в один скрипт:
<?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, и я хотел бы узнать много вещей, включая это в первую очередь. но опять же спасибо! :)
только если возможно, не могли бы вы также поделиться содержимым классов App()
и AppRequest()
, включая метод ->process($request);
. это может быть pastebin или любой другой онлайн-инструмент для вставки. я хотел бы использовать это как основу, а также ссылку для других новых разработчиков PHP.
Пожалуйста. Пример был фейком только для демонстрации какой-то логики. Вы можете взглянуть на phptherightway.com, чтобы копать дальше, когда начинаете PHP. Основная идея заключается в создании процессов «специалистов» через классы, которые будут инстанцироваться основным скриптом по мере необходимости.
@RodenerDajes, можете ли вы предоставить мне более подробную информацию об этом? Кроме того, могу ли я передать
$app
изindex.php
другим файлам php с помощью этого?