PHP/Python cheatsheet #1

July 12, 2018

«__main__» == __name__ in PHP

Когда пишешь на нескольких языках, начинаешь привносить в код разные практики из других ЯП. Я буду писать для себя шпаргалки и мелкие заметки по теме как реализовать то-то и то-то в PHP, Python, Node.js.

В python скриптах есть устоявшаяся практика, как я понял, вызывать код, если дергается сам скрипт и быть библиотекой, если скрипт импортится куда-то. Пример:

def main():
...some code...
#end

if "__main__" == __name__:
main()

Мне понравилась эта практика и захотелось такое же делать и в PHP. Раньше даже как-то в голову не приходило так использовать скрипты. Если очень хочется, то такое же поведение в PHP можно реализовать кодом:

<?php declare(strict_types=1);
function main() {
...some code...
}
if ($argv[0] == basename(__FILE__)) {
main();
}

Минус именно этого варианта и бага кроется в том, что если этот скрипт будет заимпортирован в файл с точно таким же именем, то это условие так же сработает. Это надо учитывать. Поэтому модифицируем код таким образом:

if ( realpath($argv[0]) == __FILE__  ) {
}

Теперь мы делаем проверку по полному пути к файлу. Вот теперь работает без ошибок. Есть еще один вариант, который я видел в сети, это проверка через количество в бэктрейсе:

if (count(debug_backtrace()) <  1) {...}
// or
if (!count(debug_backtrace())) {...}
// or
if (!debug_backtrace()) {...}

Вариант интересен и даже рабочий, но есть вероятность непредсказуемого поведения если поменяется API функции или вдруг функция будет переопределена (в PHP можно переопределять даже системные функции через специальное расширение).



Profile picture

Written by Alexander Mayorov
Full Stack CTO