Reputation: 12628
As per the title, is there PHP equivalent of __name__ == "__main__"
?
Is there something that would work for both scripts executed through the command line and through a web request, or would a custom function be needed?
For those unfamiliar with Python, __name__ == "__main__"
allows you to define a module file, and also have some things that allow you to run it if it is the entry point. The equivalent structure in PHP would resemble this:
// 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
Note: zerkms' answer is the best, but is not quite right - it should read:
if (!debug_backtrace()) {
// do useful stuff
}
This is significantly faster than !count(debug_backtrace()), which itself is about twice as fast as my solution involving realpath().
Upvotes: 45
Views: 7428
Reputation: 21
What about:
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {
// code..
}
for simple stuff?
Upvotes: 0
Reputation: 255055
if (!count(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)))
{
// some usefull stuff
}
look at https://www.php.net/manual/en/function.debug-backtrace.php for more details on debug_backtrace function
Upvotes: 35
Reputation: 1774
if ($argv && $argv[0] && realpath($argv[0]) === __FILE__) {
// ...
}
works like a charm.
when you run php in command line, the name of php file will pass to program as $argv[0]
and __FILE__
magic variable mean current file. So we check the running program is current file logically equals Python's __name__ == "__main__"
.
Upvotes: 14
Reputation: 9082
You probably want one of the "Magic Constants". Depending on what you are trying to do, __FILE__
, __FUNCTION__
or __CLASS__
may give you the information you are after.
They are pretty self explanatory:
__FILE__
gives you the current file name__FUNCTION__
gives you the name of the current function__CLASS__
gives you the name of the current class.Check the manual for more details
Upvotes: 2