За последние 24 часа нас посетили 17855 программистов и 1719 роботов. Сейчас ищет 881 программист ...

Странности с if (!file_exists($file)) {

Тема в разделе "Прочие вопросы по PHP", создана пользователем GoldenFILL, 18 мар 2020.

  1. GoldenFILL

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

    С нами с:
    16 мар 2017
    Сообщения:
    20
    Симпатии:
    1
    Адрес:
    Россия, Республика Крым, Симферополь
    Никаких зависимостей в коде, кроме указанных в комментариях нет. Но, при прямом указании пути для переменной $file в виде строки все отрабатывает нормально, но если я пытаюсь получить это же значение свойства private $Config из метода public function getConfig() то на строке if (!file_exists($file)) происходит что-то странное. Выполнение программы от нее отскакивает и выполняется заново (весь код начиная со старта) и во второй раз срабатывает нормально.
    Говорят ларчик просто открывается, но я уже голову потерял в поисках ключика от этого ларчика.

    PHP:
    1.     private $Config = '';
    2.    
    3.     public function getConfig()
    4.     {
    5.  
    6.         return $this->Config;
    7.     }
    8.  
    9.     private function setPathApplication($name)
    10.     {
    11.         if ($name === 'admin') {
    12.             $dir = DIR_ROOT;   // DIR_ROOT - Заранее предустановленная константа
    13.            
    14.         // $this->CORE["key-components-url"] - заранее установленный массив слов
    15.         // значение $name ('main') есть в массиве CORE["key-components-url"]
    16.         } elseif (in_array($name, $this->CORE["key-components-url"])) {
    17.             $dir = DIR_COMPONENTS; // DIR_COMPONENTS - Заранее предустановленная константа
    18.            
    19.         } else {
    20.             $dir = DIR_APPLICATIONS; // DIR_APPLICATIONS - Заранее предустановленная константа
    21.            
    22.         }
    23.  
    24.         // $dir$name/config.php = "D:/OSPanel_5_3_5/domains/gtstudio.ru/applications/main/config.php"
    25.         $this->Config = "$dir$name/config.php";
    26.     }
    27.  
    28.     public function __construct()
    29.     {
    30.  
    31.         parent::__construct();
    32.         $this->CORE['crypt'] = new \components\crypt\CryptData();
    33.         $this->setPathApplication($this->ROUTE['params'][0]);
    34.  
    35.         $_SESSION['seek-start'] ++;
    36.        
    37.         // ВОТ!!!! тут начинается непонятка. При использовании этой конструкции присвоения
    38.         // $file = $this->getConfig();
    39.         // $_SESSION['seek-start'] ++; - два раза увеличивается на единичку
    40.         // а $_SESSION['seek-end'] ++; (в конце метода) - всего один раз прибавляет единичку
    41.         // ( а должно быть тоже два раза)
    42.         $file = $this->getConfig();
    43.        
    44.         // А вот при использовании этой конструкции
    45.         // $_SESSION['seek-start'] ++; - два раза срабатывает на прибавление единички
    46.         // и $_SESSION['seek-end'] ++; (в конце метода) - тоже 2 раза увеличивается на единичку
    47.         // значения переменной $file в обоих случаях одинаковы
    48.         // работает на ура .....
    49. //        $file = "D:/OSPanel_5_3_5/domains/gtstudio.ru/applications/main/config.php";
    50.        
    51.         // не пойму, почему эта строка if (!file_exists($file)) возвращает работу кода в начало
    52.         if (!file_exists($file)) {
    53.            
    54.             // Эта срока не влияет
    55.             //die(__GTR('url_is_not_application'));
    56.         }
    57.        
    58.         $_SESSION['seek-end'] ++;
    59.     }
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    в пояснения не вникал, но по логике вещей к конструкторе должна производиться первоначальная инициализация,
    и вы должны не читать $file = $this->getConfig();, который по сути может еще и не установлен, а задать значение
    или через сеттер, которого у вас нет, либо напрямую
    PHP:
    1. $this->Config = '??? кстати а откуда он инициализаруется';
    а, заметил откуда... допустим

    надеюсь вы не думаете, что операция ++ два раза увеличивает переменную на 1, то есть дает +2 ?
    и наверное все значения в сессии тоже перед началом проверили?

    В целом похоже на то, что класс вызывается два раза. только в одном случае видит путь, в другом файл не существует, отсюда разные значения
     
    #2 ADSoft, 18 мар 2020
    Последнее редактирование: 18 мар 2020
  3. GoldenFILL

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

    С нами с:
    16 мар 2017
    Сообщения:
    20
    Симпатии:
    1
    Адрес:
    Россия, Республика Крым, Симферополь
    Да проверил все. На момент попытки получить значение из свойсва $this->Config оно уже имеет значение 'D:/OSPanel_5_3_5/domains/gtstudio.ru/applications/main/config.php', все как и задумано.
    Это значение устанавливается в конце метода privatefunction setPathApplication($name) - $this->Config="$dir$name/config.php"; . Метод естественно вызывается из конструктора.
    Переменные сессии $_SESSION['seek-start']++ и $_SESSION['seek-end']++ установлены чисто для отслеживания ошибки и больше нигде не используются. И каждый раз они прибавляют одну единичку. Просто этот код в программе срабатывает дважды, посему в нормальном порядке каждый раз значение увеличивается на 2 единицы. Так и должно быть. Но при первом включении почему-то работа кода отскакивает от if(!file_exists($file)) и вся программа начинает работать заново. При второй попытке все отрабатывает нормально.
    Трабла в том, что весь код, который работает до этой точки тоже дважды отрабатывает, что уже ни в какие ворота не лезет (((
     
    #3 GoldenFILL, 18 мар 2020
    Последнее редактирование: 18 мар 2020
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    чудес на свете не бывает
    значит вы два раза его вызываете
    покажите код вызова класса,
    а понятия "отскакивает код" - нет такого понятия
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    код в студию с тестом http://sandbox.onlinephpfunctions.com/
    --- Добавлено ---
    PHP:
    1. <?php
    2.  
    3. $a = [1];
    4. $b = &$a[0];
    5.  
    6. $b++;
    7.  
    8. print_r ($a);
     
  6. GoldenFILL

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

    С нами с:
    16 мар 2017
    Сообщения:
    20
    Симпатии:
    1
    Адрес:
    Россия, Республика Крым, Симферополь
    Все. всем спасибо. Нашел. Совсем в другом месте был баг. В дальнейшем коде файл, которого к сему моменту уже не было. Все стало нормально отрабатывать, Вот только незадача, почему не сработал die(__GTR('url_is_not_application')) , Но это уже для дальнешей работы не критично. уже сам разберусь.
    нaшел методом $_SESSION['seek-bag'] [] = $this->Config;

    PHP:
    1. if (!file_exists($file)) {
    2.     die(__GTR('url_is_not_application'));
    3. }
    Ну здесь проще. Вы увеличиваете на единицу $b, которая является ссылкой на $а, которая, кстати, является массивом.
     
    #6 GoldenFILL, 18 мар 2020
    Последнее редактирование: 18 мар 2020