魔术变量

PHP 向它运行的任何脚本提供了大量的预定义常量。

不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:

__LINE__

文件中的当前行号。

实例:

echo '这是第 “ '  . __LINE__ . ' ” 行';

?>

以上实例输出结果为:

这是第 “ 2 ” 行

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

实例:

echo '该文件位于 “ '  . __FILE__ . ' ” ';

?>

以上实例输出结果为:

该文件位于 “ E:\wamp\www\test\index.php ”

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)

实例:

echo '该文件位于 “ '  . __DIR__ . ' ” ';

?>

以上实例输出结果为:

该文件位于 “ E:\wamp\www\test ”

__FUNCTION__

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

实例:

function test() {

echo  '函数名为:' . __FUNCTION__ ;

}

test();

?>

以上实例输出结果为:

函数名为:test

__CLASS__

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。

在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。

实例:

class test {

function _print() {

echo '类名为:'  . __CLASS__ . "
";

echo  '函数名为:' . __FUNCTION__ ;

}

}

$t = new test();

$t->_print();

?>

以上实例输出结果为:

类名为:test

函数名为:_print

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

class Base {

public function sayHello() {

echo 'Hello ';

}

}

{

public function sayHello() {

parent::sayHello();

echo 'World!';

}

}

class MyHelloWorld extends Base {

}

$o = new MyHelloWorld();

$o->sayHello();

?>

以上例程会输出:

Hello World!

__METHOD__

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

实例:

function test() {

echo  '函数名为:' . __METHOD__ ;

}

test();

?>

以上实例输出结果为:

函数名为:test

__NAMESPACE__

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

实例:

namespace MyProject;

echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"

?>

以上实例输出结果为:

命名空间为:"MyProject"

魔术函数

__construct()

实例化对象时被调用,

当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

__destruct()

当删除一个对象或对象操作终止时被调用。

__call()

对象调用某个方法,

若方法存在,则直接调用;

若不存在,则会去调用__call函数。

__get()

读取一个对象的属性时,

若属性存在,则直接返回属性值;

若不存在,则会调用__get函数。

__set()

设置一个对象的属性时,

若属性存在,则直接赋值;

若不存在,则会调用__set函数。

__toString()

打印一个对象的时被调用。如echo $obj;或print $obj;

__clone()

克隆对象时被调用。如:$t=new Test();$t1=clone $t;

__sleep()

serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。

__wakeup()

unserialize时被调用,做些对象的初始化工作。

__isset()

检测一个对象的属性是否存在时被调用。如:isset($c->name)。

__unset()

unset一个对象的属性时被调用。如:unset($c->name)。

__set_state()

调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

__autoload()

实例化一个对象时,如果对应的类不存在,则该方法被调用。

以上就是本文的全部内容了,小伙伴们是否对魔术变量和魔术函数有了新的认识了呢,希望大家喜欢本文内容。

php魔术变量的概念_PHP 魔术变量和魔术函数详解相关推荐

  1. c语言c++语言中静态变量,函数详解

    静态变量,静态函数对于一些c,c++的初学者来说,造成了不少的困扰.昨晚和寝室的室友讨论到这 个问题,想了一下,作了一下总结: 虽然说c和c++在很多人的眼里就是孪生姐妹,其实还是有很大区别的.在这里 ...

  2. python变量类型是动态的_python内存动态分配过程详解

    一.前言 大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前.其他语言,想C++和java,允许"随时随地"声明变量, ...

  3. c语言中整形变量,C语言基本数据类型:整型(int)用法详解

    1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...

  4. c语言指定变量地址,C语言中 “_at()” 特殊地址定位详解

    C语言中 "_at()" 特殊地址定位详解 在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面 指令为 __at ,使用方法如下 int var ...

  5. C++常对象,常变量,常成员函数详解(含添加内容)

    既要使数据能在一定范围内共享,又要保证它不被任意修改,可使用const. ·        用const修饰的声明数据成员称为常数据成员 ·        用const修饰的声明成员函数称为常成员函数 ...

  6. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  7. java 定义抽象变量_Java抽象类和抽象方法定义与用法实例详解

    本文实例讲述了Java抽象类和抽象方法定义与用法.分享给大家供大家参考,具体如下: 一.Java抽象类 1.抽象类的说明 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都 ...

  8. C语言 static变量和函数详解

    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进 ...

  9. python的变量的输入和输出之input函数和类型转换函数详解

    一 input函数 1.Input函数可以实现用户的信息的输入 : 语法格式为: 字符串变量名(因为有input函数接受的变量的类型都是字符串的形式)=input("") 用户输入 ...

最新文章

  1. 飞线5根连接图_“飞线”和“跳线”有什么区别,你用对了吗?电路故障的排查方法...
  2. Oracle导入导出dmp文件
  3. 轻量级HTTP服务器Nginx(配置与调试Nginx)(转)
  4. LOJ#6374 网格
  5. npm安装教程 集成npm webpack vue-cli
  6. Vue2 MVVM 双向绑定(数据劫持+发布者-订阅者模式)
  7. mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决
  8. 【题解】Luogu P5360 [SDOI2019]世界地图
  9. Python——装饰器的学习笔记(legacy)
  10. bugfree 数据库配置 显示No such file or directory
  11. Linux命令第一篇
  12. VC6生成Release版本程序
  13. Netbean UML自动生成类图
  14. 回想让你最有成就感的bug是什么?你是如何发现这个bug的?
  15. 导弹打飞机问题(贪心算法)
  16. jy在线制图系统免费源码丨一秒生成广告横图海报图
  17. 大数据影响下的专题地图编制
  18. 【无标题】体验scratch海底世界
  19. MySQL——INSERT INTO
  20. 左耳听风 第二十一周

热门文章

  1. 高可用性(HA),会话复制,多VM Payara群集
  2. 具有Spring Boot和Yeoman的单页Angularjs应用程序
  3. JavaParser入门:以编程方式分析Java代码
  4. 带有JWT示例的​​Spring Oauth2
  5. ActiveMQ –经纪人网络解释–第4部分
  6. Java EE 7:新增功能???
  7. 泽西岛/贾克斯RS:流式JSON
  8. 用于Spring应用程序的Gradle原型
  9. 动态ADF火车:以编程方式添加火车停靠站
  10. JavaFX移动应用程序最佳实践,第2部分