Защита одного класса от плохого программирования другого?

Существует ли путь в PHP, чтобы попытаться включать файл, но если файл содержит ошибки, которые мешают ему компилировать, чтобы просто пропустить тот файл от включения?

7
задан Mark Tomlin 6 June 2010 в 00:08
поделиться

3 ответа

Вы можете вызвать php -l на рассматриваемом файле. Это будет работать долго и медленно. Однако он не обрабатывает ошибки времени выполнения, как die().

test.php:

<?php
function check_code_file($filename)
{
    $filename = escapeshellcmd($filename);
    system("php -l $filename 2>/dev/null 1>/dev/null", $status);
    if ($status) return false;
    return true;
}
if (check_code_file('test-good.php'))
{
    include('test-good.php');
}
if (check_code_file('test-bad.php'))
{
    include('test-bad.php');
}
print "finished\n";

test-good.php:

<?php
print "here\n";

test-bad.php:

<?php
die(

$ php test.php

here
finished
4
ответ дан 7 December 2019 в 12:15
поделиться

В зависимости от версии PHP вы можете использовать php_check_syntax () (практически то же самое, что и php -l).

Но на самом деле это мычание ... Либо вам нужно то, что вы пытаетесь включить, либо вы его не включаете.

0
ответ дан 7 December 2019 в 12:15
поделиться

Неидеальное решение, которое я хотел бы упомянуть здесь для потомков. Первоначальная идея здесь .

Вы можете зафиксировать ошибку E_PARSE, которую вы получите при неверном запросе, и передать ее функции завершения работы. Идея состоит в том, чтобы подавить ошибку синтаксического анализа ...

register_shutdown_function('post_plugin_include'); 
@require 'bad_include.php';

Затем выполните основное выполнение постфактум.

function post_plugin_include() {
    if(is_null($e = error_get_last()) === false) {
        // do something else
    }
}

Как я уже сказал, далеко не идеально, но тем не менее интересно.

1
ответ дан 7 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: