Защищать один класс от плохого программирования другого? - PullRequest
7 голосов
/ 06 июня 2010

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

Ответы [ 3 ]

4 голосов
/ 06 июня 2010

Вы можете вызвать 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";

тест-good.php:

<?php
print "here\n";

тест-bad.php:

<?php
die(

$ php test.php

here
finished
1 голос
/ 06 июня 2010

Не совсем идеальное решение, о котором я думал, что упомяну здесь для потомков. Оригинальная идея - здесь .

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

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
    }
}

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

0 голосов
/ 06 июня 2010

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

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

...