За последние 24 часа нас посетили 40749 программистов и 1748 роботов. Сейчас ищут 790 программистов ...

Несколько вопросов от новичка

Тема в разделе "PHP для новичков", создана пользователем gix, 26 дек 2014.

  1. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    Добрый день. По мере работы с пхп возникло пару вопросов на которые хотел бы получить ответ.Спасибо.
    1.Понятие суперглобальный массив-представим класс и много функций. В одной из функций(авторизация к примеру) я устанавливаю сессию. И суть как бы в том чтоб в след. функциях я мог предоставлять один контент для незарег. пользователей и другой-для зарег. пользователей. Но получается что суперглобальный массив локален для функции в которой он определен и в другой функции переменная $_SESSION видна не будет. Вот как то так.То есть как тогда реализовать доступ зарег. пользователей к контенту?
    2. Я довольно много прочитал про области видимости переменных и т.п. и везде примеры с функцией и пространством имен. А как сделать чтобы переменная определенная в одной функции(даже глобальная пусть) была видна и в другой функции?
    Еще про сессии- к примеру зарегистрирован пользователь и мне надо чтоб на каждой странице было типа Привет user(логин). Как даже такую штуку реализовать в ооп? ведь я записал сессию в одной функции, а допустим чтобы инициализировать пользователя по всему сайту, я должен эту переменную в конструкторе объявить.
    Вот как то так вообщем.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    просто фарш в общем...
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    gix, у вас каша в голове. Суперглобальные переменные видны во всей программе, как и любые другие глобальные переменные. Чтоб переменная была глобальной, она должна быть задана вне всех функций, а при обращении к ней из функции надо прописать, что функция обращается к глобальной переменной с помощью ключевого слова global.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Суперглобальный массив виден ВЕЗДЕ

    В случае класса его свойства видны внутри всегда, а снаружи если они паблик.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    gix, ты лучше напиши, что хочешь сделать, в место описания в перемешку с задачей. Мы тебе подскажем варианты решения и ты уже сделаешь вывод как это работает.
     
  6. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    )))Наверное я не совсем понятно выразился, но что такое поля они же свойства(аки глобальные переменные в классе), что такое global и что такое $_GLOBAL[]-я понимаю. а вопрос вот в чем:
    Код (Text):
    1.  
    2. <?php
    3. session_start();
    4.  
    5. function one()
    6. {
    7.  $_SESSION['hi']="helloooo";
    8. }
    9. function two()
    10. {
    11.     echo $_SESSION['hi'];
    12. }
    13. two();
    14. ?>
    замечу что не так, а именно так как в варианте выше
    Код (Text):
    1.  
    2. <?php
    3. session_start();
    4. $_SESSION['hi']="helloooo";
    5.  
    6. function two()
    7. {
    8.     echo $_SESSION['hi'];
    9. }
    10. two();
    11. ?>
    Добавлено спустя 1 минуту 42 секунды:
    запустите первый вариант и второй. хотя думаю и так многие понимают что будет.
    А если в реально проекте то в функции один я записываю пользователя в сессию, а в функции два я проверяю есть ли сессия и даю доступ к чему то, либо не даю если нет сессии.
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    а в чём задача?
     
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А где вызов one() в первом примере?
     
  9. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    Ну вопрос конкретно в том есть ли способы в php чтобы одна переменная функции была видна в другой. Судя по ответам - нет.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    gix, ну чушь же несёте! В первом вашем коде вы не вызвали функцию, которая инициализирует элемент $_SESSION["hi"], но вызвали - которая использует. Поэтому, при условии что сессия запускается в первый раз, ничего хорошего эта функция там не найдёт. Это не только на php, это на любом языке так.

    В php переменные бывают суперглобальными, глобальными и локальными (свойства класса не рассматриваем). Суперглобальные доступны всегда и везде, глобальные доступны везде, но чтоб обратиться к ним из функции, нужно использовать инструкцию global. Локальные доступны только внутри функции. Функции выполняются при их вызове, до вызова они просто код в памяти. Какие ещё могут быть вопросы?
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  12. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    ВОТ ОНО!!!!!! спасибо, навело на мысль. ведь реально функцию то не вызвал, ппц. А с сессиями был бок, потому что проверял переменный не авторизовавшись предварительно!Всем спасибо)

    Добавлено спустя 1 минуту 58 секунд:
    да согласен, это открытие из той же оперы касательно моего поста про ссылки sample/файл вместо /sample/файл) Бывает....)
     
  13. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    Итак методом проб и ошибок выяснил следующее: global работает только тогда когда вне метода есть обьявленное свойство, а вот между методами как раз работает $GLOBALS["foo"]. При чем не в формате $foo, echo $GLOBALS["foo"], а обьявление в одной функции $GLOBALS['foo'] и написании echo $GLOBALS['foo'] в другой.если не прав то поправьте
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не прав. но править не буду потому как это ты должен учиться правильно тыкать в данные. давай еще разок. если не получится тогда уже буду тебе реанимацию делать.
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    gix, вы бы с функциями просто разобрались для начала. А том методы, свойства... php вам даёт счастливую возможность понять сначала обычное функциональное программирование
     
  16. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    Согласен,еще подумаю
     
  17. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    разобрался-нужно объявлять глобальную переменную в обеих функциях)
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Разберитесь с терминологией уже
    Код (PHP):
    1. $variable = "value"; // Глобальная переменная, поскольку объявлена вне всех функций
    2.  
    3. function f() {
    4.      global $variable; // Не объявление глобальной переменной,
    5.                                // а указание интерпретатору, что эта фукнция
    6.                                // будет его использовать
    7.      echo $variable;
    8. }
    9.  
    10. funciton f1() {
    11.      $variable = 25; // Здесь локальная, поскольку нету инструкции global
    12.      echo $variable;
    13. }
    14.  
    15.  
     
  19. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    Спасибо, я понимаю то что вы указали но речь шла именно о том, чтобы сделать переменную видимой в обеих функциях, БЕЗ УКАЗАНИЯ глобальной переменной. то есть надо убрать из вашего кода $variable="value", инициализировать ее в функции f, а вывести в функции f1.ТОгда будет
    Код (Text):
    1.  
    2. function f()
    3. {
    4.     global $variable;
    5.     $variable=25;
    6. }
    7. function f1()
    8. {
    9. f();  
    10. global $variable;
    11.    echo $variable;
    12. }
    если вы знаете как сделать по другому !!!без указания полей!!!! то хотел бы увидеть
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ваш код аналогичен моему. Просто создание переменной неявно происходит, php позволяет. Я этого не люблю, поскольку труднее читать и сопровождать такой код. Вообще, глобальных переменных должно быть как можно меньше в программе.
     
  21. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  22. gix

    gix Новичок

    С нами с:
    28 окт 2014
    Сообщения:
    168
    Симпатии:
    0
    Спасибо всем за помощь. Знаю что глобальные вообще лучше не использовать, поэтому тут вопрос изначально был касательно глобальности сессий) Буду дальше разбирать. Еще раз спасибо!