PHP에서 파일을 포함시키려는 방법이 있습니까?하지만 파일에 컴파일 할 때 오류가 발생하여 포함되지 않도록 파일을 건너 뛰는 방법이 있습니까?나쁜 프로그래밍에서 한 클래스를 보호하고 있습니까?
답변
해당 파일에서 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
컴파일 오류가 아닙니다. – Artefacto
죄송합니다. 테스트 케이스를 조금 돌렸고 오타가있었습니다. 작동하는 것으로 다시 해체하십시오. –
이 솔루션은 정말 비싸게 얻을 수 있습니다. –
PHP 버전에 따라 php_check_syntax() (사실상 PHP -l과 동일)을 사용할 수 있습니다.
하지만 그 무언가 진짜 .. 당신이 포함하려고하는 물건이 필요하거나 그것을 포함시키지 않아도됩니다.
필자가 포함시키려는 내용은 필요 없지만 코드에 기능을 추가합니다. 그래서 안전하게 포함하려고합니다. 또한이 기능은 5.0.4부터 사용되지 않습니다. 답장을 보내 주셔서 고마워요! –
내가 생각하기에 이상적인 해결책은 내가 후세에 대한 언급이라고 생각했다. 원래 아이디어는 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
}
}
그럼에도 불구하고, 그럼에도 불구하고 이상적이지는 않지만 재미있다.
전에는 본 적이 없지만 흥미로운 아이디어를 제공합니다. 공유해 주셔서 감사합니다. +1 –
@ 마크 Tomlin, 물론입니다. – allnightgrocery
이것은 흥미로운 질문이지만 그 파일에 의존하는 모든 것을 망가 뜨리지는 않습니다. 더 많은 컴파일 오류가 발생합니다. –
모든 사람이 단위 테스트를 사용하고 있는지 확인하고 테스트가 통과하는지 확인해야하는 이유는 무엇입니까? 문제가있는 경우 고정 될 때까지 깨진 클래스를 조롱하십시오. –
흥미로운 질문입니다. 그래도 유스 케이스에 대해 궁금해. 파일이 컴파일되지 않은 경우에도 분명히 실행 된 적이 없습니다. 파일을 직접 포함 시키면 문제를 쉽게 해결할 수 있습니다. 아니면 팀의 다른 사람들이 저지른 나쁜 코드에서 응용 프로그램을 보호하려고합니까? 이것이 우려된다면, 해결책은'include'보다는 HR 부서와 더 관련이 있습니다. 아니면 사용자가 제공 한 파일을 동적으로 포함하고 있습니까? 그렇다면이 문제는 아마 당신의 우려 중 가장 적은 것입니다. – deceze