2015-05-13 5 views
7

Diciamo che ho la seguente situazione:C'è un modo per scoprire quale FILE ha usato require_once?

File1.php:

<?php 
require_once('init.php'); 
... 
?> 

File2.php:

<?php 
require_once('init.php'); 
... 
?> 

init.php:

<?php 
magic_function_which_tells_me_which_file_parsed_this_file(); 
... 
?> 

So che questo è un long-shot, ma c'è un modo per sapere da init.php quale file ha incluso init.php in t è l'esecuzione corrente?

+0

State chiedendo perché si vuole codice diverso incluso per situazioni diverse? –

+0

Penso che la frase "codice legacy" dice basta :) So che il file init viene utilizzato, ma non riesco a rintracciare l'esecuzione prima. –

risposta

4

Siete in grado di utilizzare debug_backtrace per trovare il chiamante anche senza funzioni:

test1.php

<?php 
echo 'test1'; 
include 'test2.php'; 

test2.php

<?php 
echo 'test2'; 
print_r(debug_backtrace()); 

uscita

ABCArray 
(
[0] => Array 
    (
     [file] => /tmp/b.php 
     [line] => 3 
     [function] => include 
    ) 

[1] => Array 
    (
     [file] => /tmp/a.php 
     [line] => 3 
     [args] => Array 
      (
       [0] => /tmp/b.php 
      ) 

     [function] => include 
    ) 
) 

Ad ogni modo, non consiglierei di usarlo perché lo può essere un notevole fattore di resistenza quando usato eccessivamente.

+1

non sto vedendo la mancanza di tali informazioni nel mio php 5.5 - avete un riferimento su tale affermazione che è stato rimosso? Anche la pagina della documentazione non menziona la rimozione di tali informazioni. –

+1

@ChrisBaker Mi dispiace, ho appena letto su questo nuovo sul doc, e ovviamente mi è stato male informato - presentato la mia risposta troppo veloce: \ – Xatenev

+0

Ho visto la tua modifica, avanti, avanti :) –

3

Nella parte superiore di init.php, è possibile utilizzare debug_backtrace() per ottenere informazioni sullo stack. Questo ti dirà, tra le altre cose, quale file ha incluso il file corrente e a quale linea.

Questo è un esempio dell'uscita backtrace. Se lo metti in una funzione, avrai un altro livello di dati. Se lo chiami nel file stesso, il livello più in alto ti dice quale file è incluso.

array (size=2) 
    0 => 
    array (size=3) 
     'file' => string 'fileThatIncudedMe.php' (length=63) 
     'line' => int 6 
     'function' => string 'require_once' (length=12) 

Si potrebbe avvolgere questo in una funzione di utilità:

function whoIncludedThisFile() { 
    $bt = debug_backtrace(); 
    $includedMe = false; 
    while (count($bt) > 0) { 
     $set = array_shift($bt); 
     if (
      array_key_exists('function', $set) === true && 
      in_array($set['function'], array('require', 'require_once', 'include', 'include_once')) 
     ){ 
      $includedMe = array('file'=>$set['file'], 'line'=>$set['line']); 
      break; 
     } 
    } 
    return $includedMe; 
} 

print_r(whoIncludedThisFile()); 
// Array ([file] => topLevelFile.php [line] => 2) 
+0

ti darei 2 voti se potevo per questa funzione, grazie di! –

+0

@ChrisBaker hai il mio voto, questo andrà dritto in un succo: P – Xatenev

+0

Questo è bello! Se OP dovesse accettare una risposta tra [mia] (http://stackoverflow.com/a/30217952/3000179) e la tua, io preferirei la tua. –

3

Certo che puoi. Con un debug_print_backtrace().

# 0 require_once() chiamato a [C: \ xampp \ htdocs \ file2.php: 3]

# 1 require_once (C: \ xampp \ htdocs \ file2.php) chiamato a [C : \ xampp \ htdocs \ file1.php: 3]

Questo vi dirà che init.php è stato incluso dal file2.php on line 3.

0

Si può anche provare a utilizzare una variabile per ottenere questo. Diamo il nome $ parentFile:

$parentFile = basename(__FILE__); 
require('some.file.here.php'); 

E in some.file.here.php:

if($parentFile == 'another.file.php') 
    // do something; 
+0

sì, sarebbe un buon approccio in alcune situazioni, ma nel mio caso non conoscevo il file genitore perché stavo lavorando su codice veramente vecchio. –

0

io chip con una risposta - ovviamente tutto il merito va ai ragazzi che già risposto a questa prima di me.

Quello che ho fatto è stato quello di formattare l'output debug_backtrace nel log degli errori:

$debug = debug_backtrace(2 , 16); 
error_log('-------------------------------'); 
foreach ($debug as $error) { 
    error_log(str_pad($error['file' ], 120) . str_pad($error ['line'] , 8) . $error['function' ]); 
} 

Il risultato sarà un file per ogni riga contenente (file, la linea, la funzione) in un modo tavolo.