За последние 24 часа нас посетили 70654 программиста и 1602 робота. Сейчас ищут 1019 программистов ...

Где логика?

Тема в разделе "Прочие вопросы по PHP", создана пользователем [vs], 25 фев 2010.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Недогоняю
    PHP:
    1. <?php
    2. class a{}
    3.  
    4. $a = new a;
    5. $k = 13;
    6. $a -> $k = 'Ice';
    7.  
    8. echo $a -> $k; // Ice
    9. // echo $a -> 13; // Syntax error
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    То же самое
    PHP:
    1. <?php
    2. $k = 13;
    3. $$k = 'Ice';
    4. echo $$k;
    5. echo $13;
    Ясно, что переменные с цифровыми именами нормально себе перевариваются. Непонятно, почему запретили к ним обращатсья напрямую.
     
  3. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    MiksIr
    Я о том, что echo $$k; - работает, echo $13; - нет.
    Если echo $13; не закомментировано, то конечно ошибка вылеттит еще при валидации синтаксиса. Заккоментируй и проверь.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Еще можно в глобальной области видимости создать переменную вообще без имени
    PHP:
    1. <?php
    2. $k = null; // sic!
    3. $$k = 'Hello';
    4. // Переменная с именем NULL существует 100%
    5. echo "{$GLOBALS['']}<br>{$$k}";
    потому что они, по-сути, элементы массива $GLOBALS. А вот внутри класса не поулчится создать свойство без имени. Опять не логично.
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    У меня получалось для потомков ArrayObject
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2. <?php
    3.  class a{}
    4.  
    5.           $a = new a;
    6.  $k = 13;
    7.  $a -> $k = 'Ice';
    8.  
    9.   echo $a -> $k; // Ice
    10.   echo $a -> {13}; // !(Syntax error) == true
    11.  
    [vs]
    Пожалейте парсер
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    [vs] по мне, так все логично.
    $a = 'var'; $$a = ...
    совсем не то, что
    $var = ...
    хотя делают одно и тоже и пересекаются.
    В первом случае правил на имя переменной нет, во втором - есть. Если хотите обращаться к одной перменной "и так и так" - то соблюдайте правила именования переменных.

    А вообще лишний показатель того, что хитро***ые конструкции следует применять очень редко и лишь в случае вопросов жизни и смерти, а лучше вообще никогда. Это как всякие eval-ы, так и variable variables. Ибо потенциально проблемные места, а самое главное - нифига не читаемые.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Было бы логично, если это было бы документировано. А так - это допускаются имена переменных, которые согласно документации in-valid.
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это не совсем так, точнее совсем не так.

    {13} это не имя переменной.
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    В переменной $k - имя переменной.
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [vs]
    ты с C знаком? Нет? Тогда не пори чушь.
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Даже если знаком - всё равно не пори чушь :)
     
  14. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это мне?

    {13} это обращение к области в стеке. Фактически там может быть любое бинарное значение поскольку это почти прямой аналог разыменовывания указателя.

    Но это никак не имя переменной.

    PHP:
    1. <?php
    2. $v = "\0";
    3.  
    4. $$v = 'dcv';
    5.  
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это тут зачем?
     
  16. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Для кузявости чтобы могли убедиться, что там 0x00
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Simpliest
    C ord пишет
    Код (Text):
    1. long(0) refcount(1)
    без
    Код (Text):
    1. string(1) "" refcount(2)
     
  18. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [vs]
    и? В чем вопрос-то?
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Simpliest
    В том, что debug_zval_dump пишет одинаковое, независимо от способа обращения к переменной:
    PHP:
    1. <?php
    2. $k = 'var';
    3. $$k = 'Ice';
    Код (Text):
    1. string(3) "Ice" refcount(2)
    2. string(3) "Ice" refcount(2)
    ... или к чему был приведеный тобой код?
     
  20. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Жесть. И? Вопрос в чем?
    Тебя смущает debug_zval_dump? Напиши вместо него var_dump, print_r...

    Код был к тому, что имя переменной обязано соответствовать соглашению о синтаксисе.
    Содержимое "указателя"(на самом деле это не указатель, но не суть важно) не обязано следовать синтаксису. Ничего нелогичного тут нет.

    То что у тебя сервер и локальная машина совпали во времени и пространстве - не значит что так будет всегда.
    Такая аналогия доступна для понимания?

    Ты сейчас как раз в роли того неофита, который не понимает разницы между этими простыми истинами и спрашивает "а как мне узнать путь к загружаемому файлу"
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    это не имя переменной
     
  22. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    $a->{$k} = 'Ice';