PHP: как получить доступ к переменным внутри функции, которые были объявлены вне ее?

В самом начале каждой страницы я включаю файл, который запускает СЕССИИ и т. д., назовем его session.php. В этот файл session.php я включаю файл, содержащий функцию, назовем ее function1.php, потому что мне нужно, чтобы функция была доступна в session.php.

Однако позже на главной странице я также включаю function2.php, которому нужен доступ к переменным, установленным в session.php, поэтому я дополнительно попытался включить session.php в function2.php.

Проблема в том, что возникает ошибка, так как function1 будет объявлен несколько раз...

Неустранимая ошибка: невозможно повторно объявить функцию1() (ранее объявленную в...

Итак, что было бы более элегантным и чистым решением для этого? Как вы могли это решить?

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


person Chris    schedule 06.07.2012    source источник


Ответы (3)


Это не проблема с общедоступными и частными переменными, поскольку переменные, которые вы хотите получить из session.php, не являются частью объекта. Это просто переменные, которые вы объявили (вероятно) в глобальной области видимости, и теперь к ним нужно получить доступ в function2.php.

Во-первых: является ли содержимое function2.php... функцией? Если нет, то этот файл должен иметь ту же область действия, что и место в вашем скрипте, из которого он был включен, и он должен иметь к ним доступ.

Если место, из которого вам нужно получить доступ к переменным session.php, является функцией или объектом, у вас есть несколько вариантов.

<сильный>0. Повторно включите файл

Это то, что вы пытаетесь сделать сейчас. Это не удается, потому что session.php также содержит определение функции, и вы не можете переопределить функцию после ее создания. В качестве обходного пути вы можете переместить определения переменных в отдельный файл и просто включить их в function2. Это неуклюже, но просто.

<сильный>1. Передайте переменные функции при ее вызове.

  • Плюсы: простой и гибкий.
  • Минусы: вызывает некоторую боль при вызове функции. Вы можете упростить это, поместив их все в один массив параметров, а не передавая каждый по отдельности.

<сильный>2. Используйте global

В начале функции2 просто добавьте команду global $var1, $var2 ..., чтобы импортировать любые переменные, которые использовались в другом месте скрипта.

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

<сильный>3. Используйте константы

В session.php определите переменные, которыми вы хотите поделиться, как константы. например, define("PASSWORD", "coolpassword123"). На константы можно ссылаться из внутренних функций или объектов и т. д., и они никогда не могут быть изменены после объявления. например, echo(PASSWORD) (без кавычек, без $).

Константы, как правило, являются лучшим решением для такого рода проблем, если 1) вам не нужно изменять их значение и 2) вы можете придерживаться простых числовых или строковых значений. Константа не может быть массивом, объектом и т.д.

person octern    schedule 06.07.2012
comment
вау, спасибо Октерн! Это потрясающее объяснение! Спасибо за отличное и хорошо объясненное понимание! :) - person Chris; 07.07.2012

попробуйте include_once вместо include

http://php.net/manual/en/function.include-once.php

РЕДАКТИРОВАТЬ: полный пример

main.php

<?php
include_once 'session.php';
include 'function2.php';

session.php

<?php
include_once 'function1.php';
function1('session.php');

function1.php

<?php
function function1($calledFrom)
{
    echo 'function1 called from: ' . $calledFrom . PHP_EOL;
}

function2.php

include_once 'function1.php';
function1('function2.php');

Поместите все это в одну папку и запустите

php main.php

Результат:

функция1 вызывается из: session.php

функция1 вызывается из: function2.php

person quickshiftin    schedule 06.07.2012
comment
пробовал, как было предложено в другом сообщении SO, не работает... но спасибо! - person Chris; 07.07.2012
comment
вы используете include_once во всех местах? - person quickshiftin; 07.07.2012
comment
ну, дважды... один раз для session.php, который включает function1.php, а затем function2.php включает session.php (и, следовательно, снова function1.php...) - person Chris; 07.07.2012
comment
include_once() предотвращает включение файла во второй раз. Это решает проблемы с переобъявлением функций и т. д., но не решает проблему возможности доступа к этим значениям из function2.php. - person octern; 07.07.2012
comment
@octern: так есть ли возможность получить доступ к этим значениям из function2.php? - person Chris; 07.07.2012
comment
после включения файла функции доступны из любого места; взгляните на пример кода, который я только что добавил. - person quickshiftin; 07.07.2012
comment
@quickshiftin: да, спасибо... Я просто запутался: функции доступны, но как насчет переменных, определенных в session.php? Они недоступны внутри function1() в function1.php... - person Chris; 07.07.2012
comment
Да, я только что опубликовал ответ с некоторыми вариантами. - person octern; 07.07.2012
comment
переменные немного отличаются, взгляните на ответ @octern - person quickshiftin; 07.07.2012

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

После этого вы можете просто передать рассматриваемую переменную в качестве параметра функции

function1($variable1);

затем получить его в функции

function function1($getvar){
    //do something with the passed variable $getvar
}
person Patrick McWilliams    schedule 06.07.2012