PHP魔术常量与魔术方法

魔术常量(Magic constants)

__CLASS__

__CLASS__ 表示代码所在类的类名。
如果处在命名空间下,将包含命名空间。

namespace KK;
class Myclass
{
  public static function show_class_name()
  {
    echo __CLASS__;
  }
}
Myclass::show_class_name(); //'KK\Myclass'

如果在非类内调用,将会返回空字符串。

echo __CLASS__; //''

__DIR__

__DIR__ 表示代码所在文件的路径,不包含文件名及目录末尾的斜杠。

__FILE__

__FILE__ 表示代码所在文件的路径,包含文件名。

__FUNCTION__

__FUNCTION__ 表示代码所在函数的函数名。

function show_function_name()
{
  echo __FUNCTION__;
}
show_function_name(); //'show_function_name'

如果在非函数中调用,将会返回空字符串。

echo __FUNCTION__; //''

也可以在方法中使用,将会返回方法名。

class Myclass
{
  public static function show_function_name()
  {
    echo __FUNCTION__;
  }
}
Myclass::show_function_name(); //'show_function_name'

__LINE__

__LINE__ 表示文件中代码所在的行号。

<?php
echo __LINE__;  //2
?>

__METHOD__

__METHOD__ 表示代码所在方法的方法名。

class Myclass
{
  public static function show_method_name()
  {
    echo __METHOD__;
  }
}
Myclass::show_method_name(); //'Myclass::show_method_name'

输出格式为 ‘类名::方法名’ ,和__FUNCTION__略有不同。

如果在函数内使用,返回和__FUNCTION__一样。

function show_method_name()
{
  echo __METHOD__;
}
show_method_name(); //'show_method_name'

如果在非方法、非函数中调用,将会返回空字符串。

echo __METHOD__;  //''

__NAMESPACE__

__NAMESPACE__ 表示代码所在的命名空间。
不存在命名空间时,返回空字符串。

__TRAIT__

__TRAIT__表示代码所在trait的类名。
如果处在命名空间下,将包含命名空间。

namespace KK;
trait Mytrait
{
  public static function show_trait_name()
  {
    echo __TRAIT__;
  }
}

class Myclass
{
  use Mytrait;
}
Myclass::show_trait_name(); //'KK\Mytrait'

如果在非trait内调用,将会返回空字符串。

echo __TRAIT__; //''

魔术方法(Magic methods)

__construct()

__construct() 构造函数。
当父类定义了构造函数并且没使用private修饰符,而且子类没有定义构造函数时,会自动继承父类的构造函数。
子类定义了构造函数时,要想使用父类的构造函数,可以使用parent::__construct()调用。

__destruct()

__destruct() 析构函数。
析构函数会在脚本结束时、使用exit/die时、对象引用都被删除时、对象被显式销毁时被调用。
当父类定义了析构函数并且没使用private修饰符,而且子类没有定义析构函数时,会自动继承父类的析构函数。
子类定义了析构函数时,要想使用父类的析构函数,可以使用parent::__destruct()调用。

__call()

__call() 调用对象中不可访问的方法时,此方法会被调用。
public function __call($name, $arguments)
第一个参数是被调用的方法名,第二个参数是被调用的方法参数数组。

__callStatic()

__callStatic() 调用对象中不可访问的静态方法时,此方法会被调用。
public static function __callStatic($name, $arguments)
与__call()一样,第一个参数是被调用的方法名,第二个参数是被调用的方法参数数组。

__get()

__get() 读取不可访问的属性时,此方法会被调用。
public function __get($name)
参数为操作的属性名。

__set()

__set() 在给不可访问的属性赋值时,此方法会被调用。
public function __set($name, $value)
第一个参数为操作的属性名,第二个参数为给此属性赋的值。

__isset()

__isset() 对不可访问属性使用isset()或empty()时,此方法会被调用。
public function __isset($name)
参数为操作的属性名。

__unset()

__unset() 对不可访问属性使用unset()时,此方法会被调用。
public function __unset($name)
参数为操作的属性名。

__sleep()

__sleep() 使用serialize()序列化对象时,此方法会被调用。
public function __sleep()
此方法需要返回一个包含对象中需要被序列化的变量名称的数组,如果没有返回,会报错。

__wakeup()

__wakeup() 使用unserialize()恢复对象时,此方法会被调用。
public function __wakeup()

__toString()

__toString() 当对象被当做字符串时,如echo (new Myclass),此方法会被调用。
public function __toString()
此方法必须返回一个字符串,否则会报错。

__invoke()

__invoke() 当尝试以调用函数的方式调用对象时,此方法会被调用。
public function __invoke()

__set_state()

__set_state() 当对对象使用var_export()时,此方法会被调用。

__clone()

__clone() 克隆对象时,此方法会被调用。

__debugInfo()

__debugInfo() 当对对象使用var_dump()时,此方法会被调用。