Как обратиться к переменной из другого файла php
Перейти к содержимому

Как обратиться к переменной из другого файла php

  • автор:

Как сделать вызов функции из другого файла в js?

Чтобы вызвать функцию, которая объявлена в другом файле (модуле), её нужно экспортировать, а в том файле, где мы хотим её использовать, — импортировать. После этого вызывать функцию можно так, как будто она объявлена в этом же файле.

// файл utils.js // объявляем функцию const sum = (a, b) => a + b; // экспортируем функцию export default sum; // файл index.js // импортируем функцию, нужно правильно указать путь до файла с функцией import sum from './utils.js'; // теперь можно работать с функцией const result = sum(2, 3); console.log(result); // => 5 

Всё, что вы должны знать о переменных окружения в PHP Перевод

Переменные окружения, используемые в конфигурации, являются на сегодняшний день основным методом установки в приложении таких настроек, как учетные данные базы, API ключи, секретные ключи и всего, что является различным в зависимости от того, где развертывается приложение. Сейчас такие настройки попадают в код через окружение, вместо прямого прописывания в файлах конфигурации или, того хуже, хардкода прямо в коде.

You can

Давайте подробнее взглянем на то:

  • как это работает?
  • действительно ли это хорошая идея?
  • как с ними работать в PHP?
  • и в заключение на некоторые рекомендации и распространенные ошибки, которых следует избегать – на те ловушки, на которые мы наткнулись в реальном мире!

Мы не будем рассматривать как настроить переменные окружения в вашем веб-сервере / Docker-е / crontab-ах. т. к. это зависит от системы, программного обеспечения, а мы хотим сосредоточиться на самих переменных окружения.

Если ваш хостинг использует Docker Swarm или AWS, все будет немного по-другому, например, т. к. они решили подсовывать файлы на файловую систему вашего контейнера, чтобы внедрить ваши секретные ключи, а не использовать переменные окружения. Это очень специфично для этих платформ и не является распространённым вариантом для всех.

Env vars 101

При запуске программы, она наследует все переменные окружения от своих родителей. Так что если вы установите переменную YOLO в значение covfefe в bash, а затем выполните команду, вы сможете прочитать YOLO в любом дочернем процессе.

$ YOLO=covfefe php -r 'echo getenv("YOLO");' covfefe

Поскольку эта переменная определена только локально, мы не можем прочитать её из другого терминала (другого родителя). Идея в том, чтобы убедиться, что ваше приложение всегда наследует нужные переменные.

Вы можете посмотреть все переменные окружения в командной строке, выполнив следующую команду, но вы не увидите переменной YOLO , т. к. она была передана только в команду php «на лету», а не установлена в текущем процессе:

Вы можете установить переменную окружения с помощью export = :

$ export YOLO=covfefe 

Имена переменных чувствительны к регистру и соглашение заключается в использовании имён только на английском, в верхнем регистре, с _ в качестве разделителя (т. н. «змеиный» стиль в верхнем регистре). Вы уже наверняка знаете некоторые переменные – такие как PATH , DISPLAY , HTTP_PROXY …

Лучшие практики на сегодня

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

  • Конфигурация существенно отличается в зависимости от того, где развёрнуто приложение (production, staging, testing…), код – нет.
  • Переменные окружения легко изменять на разных машинах без изменения кода.
  • Они являются стандартом и не зависят от используемого язык или ОС. Одни и же конфигурации могут использоваться и PHP, и Python процессами.

Манифест также довольно хорошо описывает что должно быть в коде и что должно быть в окружении – не кладите все настройки приложения в него, только то, что отличается у одного развернутого стенда от другого.

Я читал(а) в Интернете, что переменные окружения опасны

Некоторые статьи расскажут вам, что переменные окружения вредны для ваших секретных ключей. Главная причина заключается в том, что любой процесс наследует от своего родителя переменные, все из них. Так что если у вас очень секретная настройка в окружающей среде, дочерние процессы будут иметь доступ к нему:

$ export YOLO=covfefe $ php -r "echo exec('echo $YOLO');" covfefe

Дочерние процессы могут рассматривать переменную окружения, как что-то публичное, что можно записать в логи, включить в отчеты об ошибках, вывести пользователю в случае ошибки. Они могут допустить утечку ваших секретных ключей.

Альтернатива – старые текстовые файлы, со строгими Unix-правами. Но что действительно должно быть сделано, очистка окружения при запуске дочернего процесса, которому вы не доверяете, как это делает nginx. По умолчанию nginx удаляет все переменные окружения, унаследованные от своего родительского процесса, за исключением переменной TZ. Проблема решена!

Это можно сделать с помощью команды env -i , которая говорит, что следующие команды должны быть запущены в пустой среде.

$ php -r "echo exec('env -i php -r \'echo getenv(\"YOLO\");\'');" $ php -r "echo exec('php -r \'echo getenv(\"YOLO\");\'');" covfefe

Всегда запускайте процессы, которым вы не доверяете, в ограниченной среде.

Даже если вы доверяете вашему коду, вы всё равно должны быть очень осторожны и передавать ваши переменные как можно меньшему количеству процессов – кто и как их будет использовать вы никогда не знаете (внутри драма в NPM-проекте).

Подготовка приложения

При работе с переменными окружения в PHP-проекте, вы хотите убедиться, что ваш код всегда будет получать переменную из надежного источника, будь то $_ENV , $_SERVER , getenv . Но эти три метода не возвращают одинаковые результаты!

$ php -r "echo getenv('HOME');" /home/foobar $ php -r 'echo $_ENV["HOME"];' PHP Notice: Undefined index: HOME $ php -r 'echo $_SERVER["HOME"];' /home/foobar

Это потому что настройка variables_order в PHP на моей машине установлена в «GPCS» . И так как в ней нет буквы «E» , я не могу полагаться на суперглобальный массив $_ENV . Это может привести к тому, что код работающий на одном PHP не будет работать на другом.

Другой камень преткновения – это то, что разработчики не хотят управлять переменными окружения локально. Каждый раз, когда мы редактируем VirtualHost, мы не хотим перезагружать php-fpm или некую службу, или очищать кеш. Разработчики хотят иметь простой и безболезненный способ настройки переменных окружения. как .env файл!

Файл .env — это просто сборник переменных окружения с их значениями:

DATABASE_USER=donald DATABASE_PASSWORD=covfefe 

Библиотеки «Dot Env» в помощь

vlucas/phpdotenv, самая популярная библиотека на данный момент:

Эта библиотека будет читать .env файл и заполнит все суперглобальные переменные:

$dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); $s3Bucket = getenv('S3_BUCKET'); $s3Bucket = $_ENV['S3_BUCKET']; $s3Bucket = $_SERVER['S3_BUCKET'];

Есть несколько хороших плюшек, таких как возможность помечать некоторые переменные, как обязательные. (используется фреймворком Laravel)

josegonzalez/dotenv, ориентирована на безопасность:

Эта библиотека не заполнит суперглобальные переменные по умолчанию:

$Loader = new josegonzalez\Dotenv\Loader('path/to/.env'); // Парсим файл .env: $Loader->parse(); // Отправляем результат парсинга .env в переменную $_ENV: $Loader->toEnv();

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

symfony/dotenv, новый малыш на этом поприще:

Доступен начиная с Symfony 3.3. Этот компонент заботится о .env -файле, как остальные, и тоже заполняет суперглобальные массивы:

$dotenv = new Symfony\Component\Dotenv\Dotenv(); $dotenv->load(__DIR__.'/.env'); $dbUser = getenv('DB_USER'); $dbUser = $_ENV['DB_USER']; $dbUser = $_SERVER['DB_USER'];

На packagist есть ещё куча других и я даже боюсь спрашивать, почему каждый пишет тот же парсер снова и снова.

Но все они используют ту же логику:

  • найти .env файл;
  • разобрать его, проверить на вложенные значения, вытащить все переменные;
  • заполнить все суперглобальные массивы переменными, кроме тех, что уже установленны.

Я рекомендую комитить файл .env со значениями, заданными для разработчиков: каждый должен иметь возможность вытащить ваш проект и запустить его так, как ему нравится (сервер из командной строки, Apache, nginx. ) без мучений с конфигурацией.

(new Dotenv())->load(__DIR__.'/.env');

Эта рекомендация хорошо работает, когда каждый локально имеет ту же инфраструктуру: тот же пароль к БД, тот же сервер и порт. Т. к. мы используем Docker Compose на всех наших проектах, у нас никогда нет никаких различий в настройках одного разработчика от настроек другого. Если у вас нет такой плюшки, просто позвольте разработчикам перезаписывать настройки по умолчанию, импортировав два файла:

(new Dotenv())->load(__DIR__.'/.env', __DIR__.'/.env.dev');

В этом случае, вы просто должны создать и заполнить файл .env.dev тем, что отличается для вас (и добавить его .gitignore ).

Затем на продакшене, вы не должны загружать эти значения по умолчанию:

if (!isset($_SERVER['APP_ENV'])) < (new Dotenv())->load(__DIR__.'/.env', __DIR__.'/.env.dev'); >

Если вы так не сделаете, и ваш хостинг-провайдер забудет передать переменную, то запустите код в продакшене с настройками от дева, а это не приведёт ни к чему хорошему.

Подводные камни, на которые вы должны обратить внимание ⚠

Конфликты имен

Нейминг – это сложно, и переменные окружения не являются исключением из этого правила.

Поэтому при именовании переменных окружения, вы должны быть осторожными и допускать как можно меньше конфликтов имен. Ситуация усложняется тем, что нет официального списка зарезервированных имен. Хорошая практика – использовать префиксы пользовательских переменных.

В мире Unix это уже делают, используя LC_ , GTK_ , NODE_ …

Отсутствие переменных во время выполнения

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

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

  • на веб-сервере;
  • в длительных скриптах и сервисах;
  • в crontab-ах…
  • и в сценарии развертывания!

Про последний легко забыть, но так как сценарии могут разогревать кеш приложения (как Symfony-вские). да, отсутствие переменной может привести к поломке деплоя. Будьте осторожны с этим и добавите проверку при запуске приложения.

Префикс HTTP_

Есть только один префикс, который вы никогда не должны использовать: HTTP_ . Потому что его использует сам PHP (и другие cgi-подобные контексты) для хранения заголовков http-запроса.

Вы помните httpoxy уязвимость? Она возникала при поиске http-клиентом переменной в окружении таким образом, что её можно было установить через простой http-заголовок.

Некоторые DotEnv-библиотеки также предотвращают переопределение таких переменных, например, Symfony-компонент.

Потокобезопасность функции getenv()

У меня плохие новости: в некоторых конфигурациях, использование функции getenv() приведет к неожиданным результатам. Эта функция не потокобезопасна!

Вы не должны использовать её для получения ваших значений, поэтому я предлагаю вам вместо этого обращаться к $_SERVER – к тому же есть небольшая разница в производительности между обращением к массиву и вызовом функции в пользу массивов.

Переменные окружения – всегда строки

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

class Db < public function connect(string hostname, int port) < >> // Это не будет работать: $db->connect($_SERVER['DATABASE_HOSTNAME'], $_SERVER['DATABASE_PORT']);

В Symfony теперь можно преобразовывать variables, а даже больше – чтение файла, декодирование json. …

Переменные окружения везде или нет

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

Но если правильно использовать, в приложении на Symfony, например, переменные окружения могут быть изменены «на лету» — без очистки какого-либо кеша, без обращения к файловой системе, без развертывания кода: просто перезапустив процесс, например.

Тенденция иметь только одну переменную, как APP_CONFIG_PATH , и читать её через ‘%env(json:file:APP_CONFIG_PATH)%’ для меня выглядит как заново изобретать старый добрый parameters.yml , если файл не управляется автоматически с помощью надежного инструмента (как AWS Secret Store). И также есть envkey.com, который позволяет управлять вашими переменными окружения из одного места, не возясь с файлами самостоятельно, мне нравится такой подход, т. к. это гораздо проще!

php environment variables .env DotEnv переменные окружения
2017-10-26 alek13 Поделиться: оригинал

Последние посты
  • 2023-02-03Новая мажорная версия Flysystem
  • 2020-12-31Конечные автоматы для Eloquent
  • 2020-12-30Создаём REST API с помощью Laravel Orion
  • 2020-12-29При разработке локально используйте queue:listen вместо queue:work
  • 2020-12-28Laravel Desktop Notifier

Форум

[upd=1403281332][/upd]
Тогда выходит что 1 файл 1 класс с множеством методов, который разрастается до невероятных размеров.

[upd=1403283672][/upd]
Решение обычными объектами >

 ); $ob = new Plain; $ob->displayFly('flyfast');

FlyFast.php >
nick Сообщения: 112 Зарегистрирован: 06 окт 2011, 10:41 Откуда: Россия

Непрочитанное сообщение nick » 20 июн 2014, 20:45

Вы, кажется, форумом ошиблись, уважаемый. Вам сюда
Asmodey Сообщения: 338 Зарегистрирован: 18 апр 2012, 10:33

СРОЧНО УЧИТЬ МАТЧАСТЬ.

На сайте пыха приличный ман. И он обычно умеет говорить по-русски.

Redee Сообщения: 218 Зарегистрирован: 28 июн 2013, 15:43
Слушай если ты не понял что я хотел, не надо навязывать то что я и так давно знаю.
Asmodey Сообщения: 338 Зарегистрирован: 18 апр 2012, 10:33

Для того, чтобы вызвать статический метод, не обязательно создавать объект.

FlaySlow.php

 ); $ob = new Plain; $ob->performFly('FlyFast'); $ob->performFly('FlySlow');

ИМХО. Кошерней — завести базовый класс обязующий иметь fly(). Кста, а она обязательна статическая по какой-то причине?
Наследовать и проверять в Plain.
И маленький вопрос — а с какой целью класс определять строкой?
(Моё наследие с++ всегда очкует такого, я помню про мега-гибкость пыха)

Redee Сообщения: 218 Зарегистрирован: 28 июн 2013, 15:43

Нет НЕ обязательно чтобы статика была, я просто проверял как работает.
У меня была ошибка в том что надо было указывать стат. методы в классах и интерфейсе.

В этом конкретном случае для гибкости передаю строкой.
Автоподгрузка работает, все работает, открывает нужный файл с нужным классом.

Здесь НЕ нужно определять в базовом классе Plain метод fly().
В базовом только то что НЕ будет меняться.
То что меняется мы возлагаем на плечи файлам с классами.

Представь ситуацию что 50 разрабов пишут свой тип «флая)))».
Со своей стороны основняк написал и забыл, меняется только переменная для отображения «флая».
Те же разрабы напишут свои «флаи» в своих отдельных файлах.

Мне остается только положить файлы с «флаями» в папку автоподгрузки классов.

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

Asmodey Сообщения: 338 Зарегистрирован: 18 апр 2012, 10:33
Тодыть, получаем более универсальный

Plain::performFly($typeFly) < $obj = new $typeFly; $obj->fly(); >

Если флай в целевом объекте статическая, то имеем вроде как лишнее создание объекта Видится, что не большая плата.

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

ИТОГО. Если функция статическая, вызываем без создания объекта: $name::func(). Иначе — создаём экземпляр и вызываем метод. А вот ежели извернуться, и в месте вызова городить обёртку и передавать лямбду. Тогда будет вызов какого-то флая: либо статический метод, либо обёртка из вызова метода конкретного экземпляра. (Совсем что-то я фантазии ударился).

ЗЫ. В базовом классе не неизменяемая часть, а поведение по-умолчанию. Которое вполне можно заменить.

Последний раз редактировалось DelphinPRO 24 июн 2014, 11:52, всего редактировалось 1 раз.
Причина: оформляйте код соответствующим bb-тегом

Redee Сообщения: 218 Зарегистрирован: 28 июн 2013, 15:43

Сделал несколько по другому, записывая текущий тип полета в изменяемое свойство объекта.
Меняется методом «сеттером» который спрашивает данные через статику с отдельного файла/класса/стат.метода.

з.ы. На перспективе если проект разрастается (разрабы написали более 3000 файлов с «флаями») то нельзя хранить все в одной папке автоподгрузки, щас поищу как динамически изменять папки для каждого програмера, если это возможно в рамках входящего скрипта index.php

з.ы. То есть допустим все пляшет от модели самолета.
Иерархия автоподгрузки при этом принимает такой вид:
/class/[модель_самолета]/$class.php

spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки описаний классов и интерфейсов. Она создает очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию.

[upd=1403529906][/upd]
Еще такая цель, чтобы не бежало по всему стеку ф-ий автозагрузки, а точно брала необходимую автозагрузку.

[upd=1403531102][/upd]
Во начало вырисовываться имея такой тестируемый код, мы с указанием 2ух параметров, добиваемся того чтобы последняя указанная автозагрузка была ПЕРВОЙ СПРАШИВАЕМОЙ.
Без параметров мы уходим в ошибки так как спрашивается физически определенная первее автозагрузка.
Там следует наверное еще после отработки последней автозагрузки, обратно возвращать автозагрузку по умолчанию, чтобы не нарушать изначальную точку подхватывания файлов с классами.

Это пока что в стадии тестирования черновой вариант, надо сделать отдельный универсальный файл/класс/метод для выполнения данных целей.

function my_auto1($class) < include "/$class.php"; >function my_auto2($class) < include "/su35/$class.php"; >spl_autoload_register('my_auto2'); spl_autoload_register('my_auto1',true,true); $ob = new Plain('flyslow');

[upd=1403546076][/upd]
И тут опять началась эпопея с пространствами имен.

[upd=1403553633][/upd]
На деле оказалось все довольно функционально.
Окончательный вариант довольно гибкой автозагрузки с пространством здесь >
https://github.com/Redee/test/tree/mast . _aload_nsp

Подсмотрел решение через пустой вызов вначале скрипта
spl_autoload_register();
здесь >
http://habrahabr.ru/post/136761/
Там принципиально чтобы 1 к 1 были неймспейсы и пути каталогов.

Через обратный слэш вначале имени в местах указания наследования добился вынесения интерфейса в обший каталог (здесь просто вспомнил по аналогии подтягивания файлов относительно корн. каталога, в данном случае каталога с index.php).

Оказалось все прокатило, все круто и лучше некуда

з.ы. Если все в 1ой корневой папке просто вначале index.php прописываем spl_autoload_register(); и ВСЕ.
Файлы с классами подтягиваются через глобальный общий неймспейс, соответственно указывать простр.имен им НЕ надо.

[upd=1403553980][/upd]
з.ы.ы. Вот так вот отказались от многого лишнего, избыточных скриптов автозагрузки и древних решениях.

з.ы.ы.ы. Чето не смог увидеть кнопку — отредактировать сообщение или это я так на сайт влияю ))), или таймер выставили )).

Обращение к переменной из другого файла из файла вызванного методом POST

Author24 — интернет-сервис помощи студентам

Вот если к buy.php обращаемся на прямую (например прописываем в браузере в строке), то всё ок, переменная $test выводится нормальное, если обращение идёт через POST запрос, то переменная не выводится. Помогите пожалуйста разобраться почему так.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Обращение к структуре из другого файла
У меня есть 2 класса: Windows (окна) — содержащий ссылки на окна, и обрабатывающий события мыши.

Обращение к форме из другого файла
Ребята помогите разобраться. Имеется форма все компоненты я сделал public. Имеется другой файл .cs.

Обращение к элементам формы из другого файла проекта
Всех с наступающим. Есть проект, работать в котором стало не особо удобно по причине большого.

Обращение к элементам формы из другого pas файла
Подскажите как обратиться к элементу формы например Combobox1 из другого файла без "Form1.Combobox".

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *