PHP Include_once будет включать файл во второй раз, если родительский каталог имеет другой регистр - PullRequest
0 голосов
/ 05 августа 2020

У меня следующая структура каталогов:

  • test
    • скрипты
      • testClasses. php
    • testSubDirectory
      • otherSubDirectory
        • include1. php
        • include2. php
        • includeTest. php

Вот код для каждого файла: testClasses. php:

<?php
echo __FILE__."<br/>";

include1. php:

<?php
include_once("include2.php");
include_once $_SERVER['DOCUMENT_ROOT'] . "/test/scripts/testClasses.php";

incude2. php:

<?php
include_once("/test/scripts/testClasses.php");

includeTest. php :

<?php
include_once($_SERVER['DOCUMENT_ROOT'] . "/TEST/scripts/testClasses.php");
include_once("include1.php");
var_dump(get_included_files());
var_dump(get_include_path());
var_dump(__FILE__);
echo "PHP Version: ".phpversion().PHP_EOL;

При работе PHP 5.4.3 Я вижу следующий вывод: PHP 5.4.3 вывод

При работе PHP 7.4. 8 Я вижу следующий вывод: PHP 7.4.8 вывод

Оба сервера работают на Windows машинах.

Файл testClass. php включен дважды в версию PHP 7.4.8 из-за того, что в обоих случаях регистр include отличается, даже если это один и тот же файл в одном каталоге. Если в testClass. php есть объявления классов, будет выдана ошибка. Есть ли способ обойти это, чтобы мне не пришлось менять регистр в моих операторах include во всем коде?

1 Ответ

0 голосов
/ 05 августа 2020

Ваш testClass.php может проверить, определена ли константа. Если он не определен, определите его и продолжите работу с остальной частью этого файла:

if (!defined('foo')) {
  define('foo', 'bar'); // Any value will do
  // The rest of testClass.php goes here
}

Если вы хотите сделать это для нескольких файлов include d, вам придется придумать лучший соглашение об именах, отличное от "foo", чтобы ваши символы не были sh.

В качестве альтернативы, если вы знаете, что testClass.php уже определяет определенную функцию (скажем, function foo()), вы можете протестировать вместо этого:

if (!function_exists('foo')) {
  // The rest of testClass.php goes here
}
...