2010-06-06 2 views
7

PHP에서 파일을 포함시키려는 방법이 있습니까?하지만 파일에 컴파일 할 때 오류가 발생하여 포함되지 않도록 파일을 건너 뛰는 방법이 있습니까?나쁜 프로그래밍에서 한 클래스를 보호하고 있습니까?

+2

이것은 흥미로운 질문이지만 그 파일에 의존하는 모든 것을 망가 뜨리지는 않습니다. 더 많은 컴파일 오류가 발생합니다. –

+1

모든 사람이 단위 테스트를 사용하고 있는지 확인하고 테스트가 통과하는지 확인해야하는 이유는 무엇입니까? 문제가있는 경우 고정 될 때까지 깨진 클래스를 조롱하십시오. –

+0

흥미로운 질문입니다. 그래도 유스 케이스에 대해 궁금해. 파일이 컴파일되지 않은 경우에도 분명히 실행 된 적이 없습니다. 파일을 직접 포함 시키면 문제를 쉽게 해결할 수 있습니다. 아니면 팀의 다른 사람들이 저지른 나쁜 코드에서 응용 프로그램을 보호하려고합니까? 이것이 우려된다면, 해결책은'include'보다는 HR 부서와 더 관련이 있습니다. 아니면 사용자가 제공 한 파일을 동적으로 포함하고 있습니까? 그렇다면이 문제는 아마 당신의 우려 중 가장 적은 것입니다. – deceze

답변

4

해당 파일에서 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 
+0

컴파일 오류가 아닙니다. – Artefacto

+0

죄송합니다. 테스트 케이스를 조금 돌렸고 오타가있었습니다. 작동하는 것으로 다시 해체하십시오. –

+1

이 솔루션은 정말 비싸게 얻을 수 있습니다. –

0

PHP 버전에 따라 php_check_syntax() (사실상 PHP -l과 동일)을 사용할 수 있습니다.

하지만 그 무언가 진짜 .. 당신이 포함하려고하는 물건이 필요하거나 그것을 포함시키지 않아도됩니다.

+0

필자가 포함시키려는 내용은 필요 없지만 코드에 기능을 추가합니다. 그래서 안전하게 포함하려고합니다. 또한이 기능은 5.0.4부터 사용되지 않습니다. 답장을 보내 주셔서 고마워요! –

1

내가 생각하기에 이상적인 해결책은 내가 후세에 대한 언급이라고 생각했다. 원래 아이디어는 here입니다.

'require'가 좋지 않은 경우 수신 할 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 
    } 
} 

그럼에도 불구하고, 그럼에도 불구하고 이상적이지는 않지만 재미있다.

+0

전에는 본 적이 없지만 흥미로운 아이디어를 제공합니다. 공유해 주셔서 감사합니다. +1 –

+0

@ 마크 Tomlin, 물론입니다. – allnightgrocery