Не работают стандартные константы _FUNCTION_ и т.п.

Issue #6 on hold
Develops repo owner created an issue

Вход

echo __FUNCTION__;
echo __CLASS__;
echo __METHOD__;

Выход

        echo "ns\\f1";
    echo "ns\\Child";
        echo "ns\\Child::__construct";

Comments (9)

  1. Develops reporter

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

    <?php
    class cl {
      static function mt() {
        echo __CLASS__;
        echo __METHOD__;
      }
    }
    
    function fn() {
      echo "123";
      echo __FUNCTION__;
      echo __LINE__;
    }
    
    fn();
    cl::mt();
    

    Выход:

    <?php
    
    class cl
    {
            static public function mt()
            {
                    echo "cl";
                    echo "cl::mt";
            }
    }
    
    function fn()
    {
            echo "123";
            echo "fn";
            echo 12;
    }
    
    fn();
    cl::mt();
    

    Опкод:

    <pre>
    array(0) {
    }
    class cl
    array(0) {
    }
      function mt
          4   0 ECHO                     l#0  'cl'                l#0                     0
          5   1 ECHO                     l#0  'cl::mt'            l#0                     0
          6   2 RETURN                   l#0  NULL                l#0                     0
    array(0) {
    }
    function fn
       10   0 ECHO                     l#0  '123'               l#0                     0
       11   1 ECHO                     l#0  'fn'                l#0                     0
       12   2 ECHO                     l#0  12                  l#0                     0
       13   3 RETURN                   l#0  NULL                l#0                     0
      2   0 NOP                      l#0  l#0                 l#0                     0
      9   1 NOP                      l#0  l#0                 l#0                   141
     15   2 DO_FCALL                 v$1  'fn'                l#193491705             0
     16   3 INIT_STATIC_METHOD_CALL  l#0  'cl'                'mt'                    0
     16   4 DO_FCALL_BY_NAME         v$2  l#0                 l#0                     0
     17   5 RETURN                   l#0  1                   l#0                     0
    
  2. Develops reporter
    • changed status to open

    Ошибочно подставляет FUNCTION Пример:

    public function log($msg)
        {
            if ($this->log_enabled) {
                $this->log[] = $msg;
                return true;
            }
    
            return false;
        }
    

    Вывод

        public function log($msg)
        {
            if ($this->log_enabled) {
                $this->__FUNCTION__[] = $msg;
                return true;
            }
    
            return false;
        }
    
  3. Develops reporter

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

  4. Log in to comment