2017-02-21 13 views
1

Существует таинственная проблема с нашим заряжания:require_once не может загрузить существующий файл на Windows 10 (работает на Linux)

function psr4_default_autoload($class) 
{ 
    // project-specific namespace prefix 
    $prefix = 'basefolder\\'; 

    // base directory for the namespace prefix 
    $base_dir = SOURCE_DIR . '/'; 

    // does the class use the namespace prefix? 
    $len = strlen($prefix); 
    if (strncmp($prefix, $class, $len) !== 0) { 
     // no, move to the next registered autoloader 
     return; 
    } 

    // get the relative class name 
    $relative_class = substr($class, $len); 

    // replace the namespace prefix with the base directory, replace namespace 
    // separators with directory separators in the relative class name, append 
    // with .php 
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; 

    if (file_exists($file)) { 
     require_once $file; 
    } 
} 

SOURCE_DIR абсолютный путь. В противном случае это оригинальный пример автозагрузчика psr4: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md

Этот автозагрузчик работает на моем ПК с Linux и на нашем сервере. Однако в Windows file_exists($file) возвращает true, но require_once $file; не будет работать. Если мы echo $file, он возвращает именно файл, который мы хотим загрузить, и файл также существует именно там.

Сообщение об ошибке:

Fatal error: Class 'basedir\DatabaseAbstraction\AEntity' not found in C:\xampp\htdocs\xyz\classes\DatabaseAbstraction\Entity\UserLogin.php on line 14

Эта линия: class UserLogin extends AEntity. Контекст:

namespace basedir\DatabaseAbstraction\Entity; 


use basedir\DatabaseAbstraction\AEntity; 

class UserLogin extends AEntity 

любые идеи?

+0

На данный момент я сохраню свой ответ, потому что вы все равно столкнулись с проблемой. Что касается вашего редактирования, что такое содержимое '$ file', когда ошибка срабатывает? – NaeiKinDus

+0

все в порядке с '$ file'. В « Tekay37

+0

, по крайней мере, у вас сейчас что-то работает. Может быть, хорошо добавить чеки для этого, хотя;) – NaeiKinDus

ответ

2

Разделители каталога Windows являются «\», а Linux - «/»; вы должны использовать ключевое слово «DIRECTORY_SEPARATOR» для представления символа, используемого для создания путей. Он определяется во время выполнения, в зависимости от текущей ОС.

В вашем случае это даст:

$base_dir = SOURCE_DIR . DIRECTORY_SEPARATOR; 
[...] 
$file = $base_dir . str_replace('\\', DIRECTORY_SEPARATOR, $relative_class) . '.php'; // assuming your $base_dir follows the same logic 

Вам также придется переделывать SOURCE_DIR соответственно.

+0

Спасибо, но это не решило. Я редактировал свой вопрос. Автозагрузчик работал для класса, но не работает для класса, который он расширяет. – Tekay37

+0

"/" отлично работает в php на окнах – Jaime

+0

@Jaime: какая версия для Windows? Какая версия PHP? Мне было бы интересно, что :) – NaeiKinDus

0

Только для записи:

Файл AEntity.php начал с <? вместо <?php. Вот почему файл не был загружен на этом компьютере Windows.

Сейчас я плачу.

+0

Короткие теги - это параметр конфигурации в php.ini. Вероятно, он отличается от двух компьютеров. Я рекомендую всегда использовать ' Jaime