Разумеется, реальное решение состоит в том, чтобы исправить настройки вашего редактора (и других членов команды), чтобы они не хранили файлы с меткой порядка байтов UTF. Читайте здесь: https://stackoverflow.com/a/2558793/43959
Эту функцию можно использовать для «прозрачного» удаления спецификации перед включением другого файла PHP.
Примечание: я действительно рекомендую вам исправить ваши файлы / редакторы вместо того, чтобы делать неприятные вещи с eval()
, которые я демонстрирую здесь.
Это просто подтверждение концепции:
bom_test.php:
<?php
function bom_safe_include($file) {
$fd = fopen($file, "r");
// read 3 bytes to detect BOM. file read pointer is now behind BOM
$possible_bom = fread($fd, 3);
// if the file has no BOM, reset pointer to beginning file (0)
if ($possible_bom !== "\xEF\xBB\xBF") {
fseek($fd, 0);
}
$content = stream_get_contents($fd);
fclose($fd);
// execute (partial) script (without BOM) using eval
eval ("?>$content");
// export global vars
$GLOBALS += get_defined_vars();
}
// include a file
bom_safe_include("test_include.php");
// test function and variable from include
test_function($test);
test_include.php, с спецификацией в начале
test
<?php
$test = "Hello World!";
function test_function ($text) {
echo $text, PHP_EOL;
}
ВЫВОД:
kaii@test$ php bom_test.php
test
Hello World!