2010-03-10 4 views
30

Как по названию, есть ли PHP-эквивалент __name__ == "__main__"?PHP-эквивалент Python __name__ == "__main__"?

Есть ли что-то, что могло бы работать для обоих скриптов, выполняемых через командную строку и через веб-запрос, или была бы нужна специальная функция?

Для тех, кто не знаком с Python, __name__ == "__main__" позволяет вам определить файл модуля, а также некоторые вещи, которые позволяют вам запускать его, если это точка входа. Эквивалентная структура PHP будет напоминать это:

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

Примечание: ответ zerkms' является лучшим, но это не совсем верно - это следует читать:

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

Это значительно быстрее! count (debug_backtrace()), который сам примерно в два раза быстрее моего решения с участием realpath().

+0

как насчет моего ответа и подсчета (debug_backtrace())? – zerkms

ответ

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

php_sapi_name() просто сообщает мне, что код выполняется, что может обеспечить небольшую часть головоломки, но не решает проблему. Я добавил дополнительную информацию к вопросу, чтобы объяснить, что я получаю. – Shabbyrobe

+0

... или debug_backtrace() ;-) посмотрите на комментарий к вопросу – zerkms

+0

Ahh, наконец, я понимаю. debug_backtrace() работает и в тысячи раз быстрее, чем realpath. Обновите свой ответ, чтобы удалить ссылку на php_sapi_name(), и обновите свой пример, чтобы прочитать if (! Debug_backtrace()) {/ * do stuff * /} (или лучше), чтобы я мог принять. – Shabbyrobe

0

Возможно, вам нужна одна из «магических констант». В зависимости от того, что вы пытаетесь сделать, __FILE__, __FUNCTION__ или __CLASS__ могут сообщать вам информацию.

Они довольно Спроецировать

  • __FILE__ дает имя текущего файла
  • __FUNCTION__ дает вам имя текущей функции
  • __CLASS__ дает имя текущего класса.

Проверить the manual для более подробной информации

+0

Наверное, но как мне добиться того, что я прошу с ними? – Shabbyrobe

+0

Похоже, вы поняли это в своем собственном ответе :) –

+5

Я думаю, что '(realpath ($ argv [0]) == __FILE __)' может это сделать. – Darien

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

работает как шарм.

при запуске php в командной строке имя файла php будет передаваться программе как $argv[0] и __FILE__ магический переменный средний текущий файл. Поэтому мы проверяем, что работающая программа - это текущий файл, логически равный __name__ == "__main__" Python.

+0

Пожалуйста, отредактируйте ваше сообщение и объясните, почему он работает. –