2010-06-06 6 views
7

C'è un modo in PHP per provare ad includere un file, ma se il file contiene errori che impediscono la compilazione per saltare il file dall'inclusione?Protezione di una classe dalla cattiva programmazione di un'altra?

+2

Questa è una domanda interessante, ma non sarebbe in grado di rompere qualunque cosa dipendesse da quel file, causando più errori di compilazione? –

+1

Perché non assicurarsi che tutti stiano utilizzando i test unitari e verificare che i test passino prima di includerlo. Se ci sono problemi, prendi in giro la lezione rotta finché non viene risolta. –

+0

Interessante domanda. Mi chiedo però del caso d'uso. Se un file non viene nemmeno compilato, ovviamente non è mai stato nemmeno eseguito. Se includi tu stesso il file, dovresti essere in grado di risolvere facilmente i problemi. O stai cercando di proteggere l'applicazione dal codice errato commesso da altri sul tuo team? Se questo è un problema, la soluzione ha più a che fare con il dipartimento risorse umane di "include". O stai includendo dinamicamente i file dei contributi degli utenti? Quindi questo problema è probabilmente l'ultimo dei tuoi dubbi. – deceze

risposta

4

È possibile chiamare php -l sul file in questione. Tuttavia, questo verrà eliminato e lento. non gestisce gli errori di runtime come die() però.

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 
+0

Non per errori di compilazione. – Artefacto

+0

sì, scusate, affrettate un po 'il caso di test, ha avuto un refuso. Ridimensionato con uno che funziona. –

+1

Tuttavia, questa soluzione può essere molto costosa. –

0

A seconda della versione di PHP è possibile utilizzare php_check_syntax() (praticamente uguale a php -l).

Ma è davvero un punto moo .. O avete bisogno delle cose che il vostro tentativo di includere o non lo includete.

+0

Non ho bisogno del materiale che sto cercando di includere, ma aggiunge funzionalità al codice. Quindi sto cercando di includere in modo sicuro. Inoltre, ho appena controllato, questa funzione è deprecata da 5.0.4. Grazie per la risposta! –

1

Una soluzione tutt'altro che ideale pensavo di menzionare qui per i posteri. L'idea originale è here.

È possibile acquisire l'errore E_PARSE che si verificherebbe in caso di "richiesta" errata e consegnarlo a una funzione di arresto. L'idea è quella di sopprimere l'errore di analisi ...

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

Poi fare la vostra esecuzione primario dopo il fatto.

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

Come ho detto, meno che ideale, ma comunque interessante.

+0

Non l'ho mai visto prima, e offre alcune idee interessanti. Grazie per la condivisione. +1 –

+0

@ Mark Tomlin, Certamente. – allnightgrocery

Problemi correlati