Добрый день. По мере работы с пхп возникло пару вопросов на которые хотел бы получить ответ.Спасибо. 1.Понятие суперглобальный массив-представим класс и много функций. В одной из функций(авторизация к примеру) я устанавливаю сессию. И суть как бы в том чтоб в след. функциях я мог предоставлять один контент для незарег. пользователей и другой-для зарег. пользователей. Но получается что суперглобальный массив локален для функции в которой он определен и в другой функции переменная $_SESSION видна не будет. Вот как то так.То есть как тогда реализовать доступ зарег. пользователей к контенту? 2. Я довольно много прочитал про области видимости переменных и т.п. и везде примеры с функцией и пространством имен. А как сделать чтобы переменная определенная в одной функции(даже глобальная пусть) была видна и в другой функции? Еще про сессии- к примеру зарегистрирован пользователь и мне надо чтоб на каждой странице было типа Привет user(логин). Как даже такую штуку реализовать в ооп? ведь я записал сессию в одной функции, а допустим чтобы инициализировать пользователя по всему сайту, я должен эту переменную в конструкторе объявить. Вот как то так вообщем.
gix, у вас каша в голове. Суперглобальные переменные видны во всей программе, как и любые другие глобальные переменные. Чтоб переменная была глобальной, она должна быть задана вне всех функций, а при обращении к ней из функции надо прописать, что функция обращается к глобальной переменной с помощью ключевого слова global.
Суперглобальный массив виден ВЕЗДЕ В случае класса его свойства видны внутри всегда, а снаружи если они паблик.
gix, ты лучше напиши, что хочешь сделать, в место описания в перемешку с задачей. Мы тебе подскажем варианты решения и ты уже сделаешь вывод как это работает.
)))Наверное я не совсем понятно выразился, но что такое поля они же свойства(аки глобальные переменные в классе), что такое global и что такое $_GLOBAL[]-я понимаю. а вопрос вот в чем: Код (Text): <?php session_start(); function one() { $_SESSION['hi']="helloooo"; } function two() { echo $_SESSION['hi']; } two(); ?> замечу что не так, а именно так как в варианте выше Код (Text): <?php session_start(); $_SESSION['hi']="helloooo"; function two() { echo $_SESSION['hi']; } two(); ?> Добавлено спустя 1 минуту 42 секунды: запустите первый вариант и второй. хотя думаю и так многие понимают что будет. А если в реально проекте то в функции один я записываю пользователя в сессию, а в функции два я проверяю есть ли сессия и даю доступ к чему то, либо не даю если нет сессии.
Ну вопрос конкретно в том есть ли способы в php чтобы одна переменная функции была видна в другой. Судя по ответам - нет.
gix, ну чушь же несёте! В первом вашем коде вы не вызвали функцию, которая инициализирует элемент $_SESSION["hi"], но вызвали - которая использует. Поэтому, при условии что сессия запускается в первый раз, ничего хорошего эта функция там не найдёт. Это не только на php, это на любом языке так. В php переменные бывают суперглобальными, глобальными и локальными (свойства класса не рассматриваем). Суперглобальные доступны всегда и везде, глобальные доступны везде, но чтоб обратиться к ним из функции, нужно использовать инструкцию global. Локальные доступны только внутри функции. Функции выполняются при их вызове, до вызова они просто код в памяти. Какие ещё могут быть вопросы?
А зачем тебе это? Ключевое слово global https://php.net/manual/ru/language.variables.scope.php#lang ... ope.global
ВОТ ОНО!!!!!! спасибо, навело на мысль. ведь реально функцию то не вызвал, ппц. А с сессиями был бок, потому что проверял переменный не авторизовавшись предварительно!Всем спасибо) Добавлено спустя 1 минуту 58 секунд: да согласен, это открытие из той же оперы касательно моего поста про ссылки sample/файл вместо /sample/файл) Бывает....)
Итак методом проб и ошибок выяснил следующее: global работает только тогда когда вне метода есть обьявленное свойство, а вот между методами как раз работает $GLOBALS["foo"]. При чем не в формате $foo, echo $GLOBALS["foo"], а обьявление в одной функции $GLOBALS['foo'] и написании echo $GLOBALS['foo'] в другой.если не прав то поправьте
не прав. но править не буду потому как это ты должен учиться правильно тыкать в данные. давай еще разок. если не получится тогда уже буду тебе реанимацию делать.
gix, вы бы с функциями просто разобрались для начала. А том методы, свойства... php вам даёт счастливую возможность понять сначала обычное функциональное программирование
Разберитесь с терминологией уже Код (PHP): $variable = "value"; // Глобальная переменная, поскольку объявлена вне всех функций function f() { global $variable; // Не объявление глобальной переменной, // а указание интерпретатору, что эта фукнция // будет его использовать echo $variable; } funciton f1() { $variable = 25; // Здесь локальная, поскольку нету инструкции global echo $variable; }
Спасибо, я понимаю то что вы указали но речь шла именно о том, чтобы сделать переменную видимой в обеих функциях, БЕЗ УКАЗАНИЯ глобальной переменной. то есть надо убрать из вашего кода $variable="value", инициализировать ее в функции f, а вывести в функции f1.ТОгда будет Код (Text): function f() { global $variable; $variable=25; } function f1() { f(); global $variable; echo $variable; } если вы знаете как сделать по другому !!!без указания полей!!!! то хотел бы увидеть
Ваш код аналогичен моему. Просто создание переменной неявно происходит, php позволяет. Я этого не люблю, поскольку труднее читать и сопровождать такой код. Вообще, глобальных переменных должно быть как можно меньше в программе.
Лучше все переменные передавать в функцию, тогда легче код развивать и поддерживать. Ещё почитай вот это: https://php.net/manual/ru/language.references.pass.php https://php.net/manual/ru/language.references.php https://php.net/manual/ru/language.references.return.php https://php.net/manual/ru/language.references.whatdo.php
Спасибо всем за помощь. Знаю что глобальные вообще лучше не использовать, поэтому тут вопрос изначально был касательно глобальности сессий) Буду дальше разбирать. Еще раз спасибо!