За последние 24 часа нас посетили 20128 программистов и 1080 роботов. Сейчас ищут 796 программистов ...

Что происходит?

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 28 мар 2022.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. <?php
    2.  
    3.  
    4. namespace core;
    5.  
    6.  
    7. class App
    8. {
    9.     use a;
    10. }
    Раз (всё нормально - нужная ошибка)

    PHP:
    1. <?php
    2.  
    3. use core\App;
    4.  
    5. chdir('..');
    6. spl_autoload_register(fn($class) => include strtr("$class.php", '\\', '/'));
    7.  
    8. register_shutdown_function(fn() => var_dump(error_get_last()['message'])); // Trait 'core\a' not found
    9.  
    10. new App();
    Два (не совсем та ошибка)

    PHP:
    1. <?php
    2.  
    3. use core\App;
    4.  
    5. chdir('..');
    6. spl_autoload_register(fn($class) => require strtr("$class.php", '\\', '/'));
    7.  
    8. register_shutdown_function(fn() => var_dump(error_get_last()['message'])); // require(): Failed opening required 'core/a.php' (include_path='.:/usr/share/php')
    9.  
    10. new App();
    Мне нужно - Trait 'core\a' not found, оно вылетает при include, НО мне нужен require, мне на include проверку повесить? Но тогда при отстутствии файла будет белый экран, как я эту ошибку узнаю? По сообщению, что класс не найден? А откуда я узнаю он не найден или его вообще не существует )))

    Суть: пилю глобальный обработчик, НО Throwable не ловит все ошибки, например, несуществующий трейт он не ловит - это неперехваченная, поэтому register_shutdown_function().
     
    #1 Вероломство, 28 мар 2022
    Последнее редактирование: 28 мар 2022
  2. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Потому что путь к фаилам относительный и в зависимости где ты его используешь, он разный. Пропиши абсолютный путь.
    Держи моего динозавра. 5 лет стабильной работы на 2х проектах. Потом перешел на composer и понял что занимался хернёй :)

    PHP:
    1. <?php
    2.  
    3. class Autoloader
    4. {
    5.     static public function loader($className)
    6.     {
    7.         $parts = explode('\\', $className);
    8.         $name = array_pop($parts);
    9.         $path = implode('/', $parts);
    10.  
    11.         $true_path =  <путь до папки>. $path . '/' . $name . '.php';
    12. //         var_dump($true_path);
    13.  
    14.         if ( file_exists($true_path) ) {
    15.             require_once($true_path);
    16.  
    17.             if ( class_exists($className) ) {
    18.                 return TRUE;
    19.             }
    20.         }
    21.  
    22.         return FALSE;
    23.     }
    24. }
    25.  
    26. spl_autoload_register('Autoloader::loader');
     
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    и при чём тут register_shutdown_function()
     
  4. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Действительно.жпг. Простите за оффтоп, сонный был.
     
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну я разобрался: проверку на include