Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
    There are a few magical constants that change depending on
    where they are used. For example, the value of
    __LINE__ depends on the line that it's
    used on in a script. All these "magical" constants are resolved
    at compile time, unlike regular constants, which are resolved at runtime. 
    These special constants are case-insensitive and are as follows:
   
| Name | Description | 
|---|---|
__LINE__ | 
        The current line number of the file. | 
__FILE__ | 
        The full path and filename of the file with symlinks resolved. If used inside an include, the name of the included file is returned. | 
__DIR__ | 
        
         The directory of the file. If used inside an include,
         the directory of the included file is returned. This is equivalent
         to dirname(__FILE__). This directory name
         does not have a trailing slash unless it is the root directory.
         | 
       
__FUNCTION__ | 
        
         The function name, or {closure} for anonymous functions.
         | 
       
__CLASS__ | 
        
         The class name. The class name includes the namespace
         it was declared in (e.g. Foo\Bar).
         When used inside a trait method,
         __CLASS__ is the name of the class the trait
         is used in.
         | 
       
__TRAIT__ | 
        
         The trait name. The trait name includes the namespace
         it was declared in (e.g. Foo\Bar).
         | 
       
__METHOD__ | 
        The class method name. | 
__PROPERTY__ | 
        Only valid inside a property hook. It is equal to the name of the property. | 
__NAMESPACE__ | 
        The name of the current namespace. | 
ClassName::class | 
        The fully qualified class name. | 
Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".If PHP is run inside a web server request there is an important difference between the __DIR__ constant and $_SERVER['DOCUMENT_ROOT'].
Where __DIR__ of a PHP script contained within a sub-folder will include the complete server path $_SERVER['DOCUMENT_ROOT'] will contain a server path up to the _root_ of the application. This can be helpful when for instance an auto-loader is defined in an include file sitting inside a sub-folder and where the classes are located in another folder at the root of the application.<?php
namespace My\App {
  class Api {
    public static fetch() {
      print __FUNCTION__ . "\n"; // outputs fetch
      print __METHOD__ . "\n"; // outputs My\App\Api::fetch
    }
  }
  Api::fetch();
}
namespace {
  My\App\Api::fetch();
}
?>
__METHOD__ outputs a fully qualified method name; __FUNCTION__ when used in a method, outputs just the method name.