魔术常量 & 魔术方法 & 魔术引号

魔术常量

http://php.net/manual/zh/language.constants.predefined.php

  • __LINE__ 文件中的当前行号。
  • __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
  • __DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
  • __FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。
  • __CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
  • __METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
  • __NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

魔术方法

http://php.net/manual/zh/language.oop5.magic.php

约十三个有特殊含义的方法。
construct()、 destruct()、 call()、 callStatic()、 get()、
set()、 isset()、 unset()、 sleep()、 wakeup()、 toString()、
invoke()、 set_state() 、 clone()
这些方法在PHP中被称为"魔术方法"(Magic methods)。 你在命名自己的类方法时不能使用这些方法名, 除非你希望使用"魔术"功能。
构造函数和析构函数
如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset。
属性重载
public void set ( string $name , mixed $value ) 在给未定义的变量赋值时调用。
public mixed
get ( string $name ) 读取未定义的变量的值时调用。
public bool isset ( string $name ) 当对未定义的变量调用isset() 或 empty()时调用。
public void
unset ( string $name ) 当对未定义的变量调用unset()时调用。
参数$name是指要操作的变量名称 ,包括没有访问权限的属性(protected,private)。set() 方法的$value 参数指定了$name变量的值。
属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为static。 从PHP 5.3.0起, 将这些魔术方法定义为static会产生一个警告。
方法重载
public mixed
call ( string $name , array $arguments ) 当调用一个不可访问方法(如未定义,或者不可见)时调用 。
public static mixed callStatic ( string $name , array $arguments ) 当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时调用。
$name参数是要调用的方法名称。$arguments参数是一个数组,包含着要传递给方法的参数。
sleep() 和 wakeup()
public array
sleep ( void )
函数会检查是否存在一个魔术方法 sleep().如果存在,sleep()方法会先被调用, 然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,并产生 一个E_NOTICE错误。
sleep()方法常用于提交未提交的数据,或类似的清理操作。同时,如果你有一些很大的对象, 不需要全部保存,这个功能就很好用。
void
wakeup ( void )serialize()
与之相反,unserialize()会检查是否存在一个wakeup()方法。如果存在,则会先调用 wakeup方法,预先准备对象需要的资源。
wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
对象的输出
public string
toString ( void )
当对象被当做字符串输出时这个函数会被调用,该方法必须返回一个字符串,否则产生一个E_RECOVERABLE_ERROR致命错误。
mixed invoke ([ $... ] )
当尝试以调用函数的方式调用一个对象时,
invoke() 方法会被自动调用。
static object set_state ( array $properties )
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按array('property' => value, ...)格式排列的类属性。
对象复制
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同, 但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况: 如果对象A中保存着对象B的引用,当你复制对象A时,你想其中使用的对象不再是对象B而是B的一个副本,那么 你必须得到对象A的一个副本。
对象复制可以通过clone关键字来完成(如果可能,这将调用对象的
clone()方法)。对象中的 clone()方法不能被直接调用。
$copy_of_object = clone $object;
当对象被复制后,PHP5会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。
void
clone ( void )
当复制完成时, 如果定义了clone()方法, 则新创建的对象(复制生成的对象)中的clone()方法会被调用, 可用于修改属性的值(如果有必要的话)。
自动加载对象
很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。在 PHP 5 中,不再需要这样了。可以定义一个 autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
Note:在
autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,而且如果使用 PHP 的 CLI 交互模式 时,Autoloading 不存在。

魔术引号(废弃)

魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。最好在编码时不要转义而在运行时根据需要而转义。 magic_quotes_gpc 影响到 HTTP 请求数据(GET,POST 和 COOKIE)。不能在运行时改变。在 PHP 中默认值为 on。
magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off。
magic_guotes_sybase 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc 。如果同时打开两个选项的话,单引号将会被转义成 ''。而双引号、反斜线 和 NULL 字符将不会进行转义。

__autoload
如果要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:

注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。