2010-03-10 8 views
30

Wie der Titel, gibt es PHP entspricht __name__ == "__main__"?PHP-Äquivalent von Pythons __name__ == "__main__"?

Gibt es etwas, das für beide Skripts funktionieren würde, die über die Befehlszeile und über eine Webanforderung ausgeführt werden, oder wäre eine benutzerdefinierte Funktion erforderlich?

Für diejenigen, die mit Python nicht vertraut sind, können Sie mit __name__ == "__main__" eine Moduldatei definieren und auch einige Dinge, mit denen Sie es ausführen können, wenn es der Einstiegspunkt ist. Die äquivalente Struktur in PHP ähneln würde dies:

// 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 

Hinweis: zerkms' Antwort ist die beste, aber es ist nicht ganz richtig - es sollte lauten:

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

Dies ist deutlich schneller als! count (debug_backtrace()), das ist etwa doppelt so schnell wie meine Lösung mit Realpath().

+0

Was ist mit meiner Antwort und Anzahl (debug_backtrace())? – zerkms

Antwort

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

php_sapi_name() sagt mir nur, wo der Code ausgeführt wird, der einen kleinen Teil des Puzzles liefern kann, aber das Problem nicht löst. Ich fügte der Frage einige weitere Informationen hinzu, um zu erklären, worauf ich hinauswill. – Shabbyrobe

+0

... oder debug_backtrace() ;-) schau auf den Kommentar zu der Frage – zerkms

+0

Ahh, endlich verstehe ich. debug_backtrace() funktioniert und ist tausendmal schneller als der reale Pfad. Aktualisieren Sie Ihre Antwort, um den Verweis auf php_sapi_name() zu entfernen, und aktualisieren Sie Ihr Beispiel, um zu lesen, ob (! Debug_backtrace()) {/ * tu Zeug * /} (oder besser), damit ich akzeptieren kann. – Shabbyrobe

0

Sie wollen wahrscheinlich einen der "Magic Constants". Abhängig davon, was Sie versuchen, können __FILE__, __FUNCTION__ oder __CLASS__ Ihnen die Informationen geben, nach denen Sie suchen.

Sie sind ziemlich selbsterklärend:

  • __FILE__ gibt Ihnen die aktuellen Dateinamen
  • __FUNCTION__ Sie den Namen der aktuellen Funktion
  • __CLASS__ gibt Ihnen den Namen der aktuellen Klasse gibt.

prüfen the manual für mehr Details

+0

Wahrscheinlich, aber wie gehe ich vor, um das zu erreichen, was ich von denen erwarte? – Shabbyrobe

+0

Sieht aus, als hättest du es in deiner eigenen Antwort herausgefunden :) –

+5

Ich denke, dass '(realpath ($ argv [0]) == __FILE __)' könnte es tun. – Darien

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

funktioniert wie ein Zauber.

Wenn Sie PHP in der Befehlszeile ausführen, wird der Name der PHP-Datei übergeben, um als $argv[0] und __FILE__ magische Variable mittleren aktuellen Datei zu programmieren. So überprüfen wir das laufende Programm ist die aktuelle Datei logisch entspricht Pythons __name__ == "__main__".

+0

Bitte bearbeiten Sie Ihren Beitrag und erklären Sie, warum das funktioniert. –

Verwandte Themen