2010-03-10 12 views
30

Según el título, ¿hay un equivalente en PHP de __name__ == "__main__"?PHP equivalente de Python's __name__ == "__main__"?

¿Hay algo que funcione tanto para los scripts ejecutados a través de la línea de comando como a través de una solicitud web, o se necesitaría una función personalizada?

Para quienes no estén familiarizados con Python, __name__ == "__main__" le permite definir un archivo de módulo, y también tiene algunas cosas que le permiten ejecutarlo si es el punto de entrada. La estructura equivalente en PHP se parecería a esto:

// SomeClass.php 
<?php 
class SomeClass 
{ 
    function doStuff() { 
     echo "wahey!\n"; 
    } 
} 

// python, I know. 
if (__name__ == "__main__") { 
    $sc = new SomeClass; 
    $sc->doStuff(); 
} 
?> 

// OtherClass.php 
<?php 
require_once("SomeClass.php"); 
class OtherClass 
{ 
    public $yep; 
} 
?> 

// command line: 
php SomeClass.php  // outputs "wahey!" 
php OtherClass.php // outputs nothing 

Nota: Respuesta zerkms' es el mejor, pero no está del todo bien - Se debería leer:

if (!debug_backtrace()) { 
    // do useful stuff 
} 

Este es significativamente más rápido que! count (debug_backtrace()), que en sí mismo es aproximadamente el doble de rápido que mi solución que involucra a realpath().

+0

¿qué ocurre con mi respuesta y conteo (debug_backtrace())? – zerkms

Respuesta

28
if (!count(debug_backtrace())) 
{ 
    // some usefull stuff 
} 
+0

php_sapi_name() simplemente me dice en qué se está ejecutando el código, lo que puede proporcionar una pequeña parte del rompecabezas pero no resuelve el problema. Agregué más información a la pregunta para explicar a qué me refiero. – Shabbyrobe

+0

... o debug_backtrace() ;-) mira el comentario a la pregunta – zerkms

+0

Ahh, finalmente, lo entiendo. debug_backtrace() funciona, y es miles de veces más rápido que el realpath. Actualice su respuesta para eliminar la referencia a php_sapi_name() y actualice su ejemplo para leer if (! Debug_backtrace()) {/ * do stuff * /} (o mejor) para que pueda aceptarlo. – Shabbyrobe

0

Probablemente desee una de las "constantes mágicas". Dependiendo de lo que esté tratando de hacer, __FILE__, __FUNCTION__ o __CLASS__ pueden darle la información que está buscando.

que son bastante explica por sí mismo:

  • __FILE__ le da el nombre de archivo actual
  • __FUNCTION__ le da el nombre de la función actual
  • __CLASS__ le da el nombre de la clase actual.

Comprobar the manual para más detalles

+0

Probablemente, pero ¿cómo hago para lograr lo que estoy pidiendo con eso? – Shabbyrobe

+0

Parece que lo has descubierto en tu propia respuesta :) –

+5

Creo que '(realpath ($ argv [0]) == __FILE __)' podría hacerlo. – Darien

4
if ($argv && $argv[0] && realpath($argv[0]) === __FILE__) { 
    // ... 
} 

funciona como un encanto.

cuando ejecuta php en la línea de comandos, el nombre del archivo php pasará al programa como $argv[0] y __FILE__ variable mágica significa archivo actual. Así que verificamos que el programa en ejecución sea el archivo actual lógicamente igual al __name__ == "__main__" de Python.

+0

Por favor edite su publicación y explique por qué funciona. –

Cuestiones relacionadas