PHP几种常见魔术方法与魔术变量解析
PHP几种常见魔术方法与魔术变量解析
先不多说,直接上代码,如下:
1 class Demo 2 { 3 private $str = 'str'; 4 5 //实例化时自动加载function 6 public function __construct() 7 { 8 echo "start<br/>"; 9 } 10 11 //__call()用来获取没有定义的function 12 public function __call($name, $arguments) 13 { 14 echo $name.'_call<br>'; 15 } 16 17 //获取私有变量 18 public function __get($name) 19 { 20 // TODO: Implement __get() method. 21 echo $this->$name.'_get<br/>'; 22 } 23 24 //通过关键字 clone 克隆一个对象时该对象调用__clone()方法 25 public function __clone() 26 { 27 // TODO: Implement __clone() method. 28 } 29 30 //__set()设置私有变量的值 31 public function __set($name, $value) 32 { 33 // TODO: Implement __set() method. 34 $this->$name = $value; 35 } 36 37 //————callStatic()调用没有被定义的static静态function 38 public static function __callStatic($name, $arguments) 39 { 40 // TODO: Implement __callStatic() method. 41 echo $name.'_classStatic'; 42 } 43 44 //删除类对象时候自动调用 45 public function __destruct() 46 { 47 // TODO: Implement __destruct() method. 48 echo "end"; 49 } 50 51 52 } 53 54 $class = new Demo(); 55 $class->success(); 56 $class->succ = 111; 57 echo $class->succ; 58 echo $class->str; 59 echo '<br>'; 60 $obj = clone $class; 61 print_r($obj); 62 echo '<br>'; 63 $class::end();
运行结果:
start success_call 111str_get clone Demo Object ( [str:Demo:private] => str [succ] => 111 ) end_classStatic endend
方法总结:
1. __set(),__get(),__isset(),__unset()可以归之为一类,适用于私有变量的设置、取值、判断、删除的操作。
2. __construct()构造函数,__desctruct()析构函数,实例化类的时候就会产生,有一点不同,构造在最前面,
析构函数在最后面
3. 当调用class中没有定义的方法时,会报错fail error,如果class中定义了__call(),会直接调用__call()方法进行操作。
例如:$class->success('data');类中的__call方法开始执行把参数转换为数组形式array([0] => 'data');
__callStatic()方法同理,只是对没有定义的静态方法起作用。
几种常见的魔术变量:
1 namespace app; 2 3 //__LINE__ 当前脚本行号 4 echo __LINE__.'<br/>'; 5 6 //__FILE__ 文件的完整路径与文件名 7 echo __FILE__.'<br/>'; 8 9 //__DIR__ 文件所在目录 10 echo __DIR__.'<br/>'; 11 12 class Test { 13 function demo(){ 14 //__FUNCTION__ 函数名称 ,php5以后返回该函数被定义时的名字(区分大小写) 15 echo __FUNCTION__.'<br/>'; 16 17 //__CLASS__ 类名称,PHP 5 起本常量返回该类被定义时的名字(区分大小写)。 18 //注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。 19 //当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。 20 echo __CLASS__.'<br/>'; 21 22 //__METHOD__ 类的方法名,返回该方法被定义时的名字(区分大小写) 23 echo __METHOD__.'<br/>'; 24 25 26 //__NAMESPACE__ 当前命名空间 27 echo __NAMESPACE__.'<br/>'; 28 } 29 } 30 31 (new Test())->demo(); 32 33 trait HelloWorld { 34 public function sayHello() { 35 //__TRAIT__ Trait 的名字 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写) 36 echo __TRAIT__.'<br/>'; 37 } 38 } 39 40 class TheWorldIsNotEnough { 41 use HelloWorld; 42 } 43 $o = new TheWorldIsNotEnough(); 44 $o->sayHello();
输出结果:
12 G:\phpstudy\PHPTutorial\WWW\phpDemo\03-08.php G:\phpstudy\PHPTutorial\WWW\phpDemo demo app\Test app\Test::demo app app\HelloWorld
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SpringBoot 2 要不要升级
[TOC] 前言 在谈SpringBoot 2.x 之前,先来聊点别的: 首先是Java 语言,这门长期占据编程语言排行榜首位的语言到底有什么魔力?大家的看法是多种多样的,比如: 面向对象设计,使用简单,可以很快速的入门; 开源生态做得好,很多可重用的组件,拿来即用; 跨平台,高性能,是做后台开发的首选 还有一种观点很有意思:这是命好,每当人们觉得 Java 不行了的时候,总会有英雄横刀救美.. 其中,主要说的是: ":最初 Java 开发出来不知道有什么用的时候,发现可以用 Applet 在网页上做动画。 后来企业级软件开发时代 JavaEE 大行其道,开源社区 Spring 桃李满天下。等到了移动时代,人们觉得 Java 要完蛋了,Google 拍马救市,收购并开放了 Android 平台,当家语言就是 Java。于是 Java 再次焕发勃勃生机
- 下一篇
JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))
JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程)) java虚拟机的内存区域分配 在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据 (类似于Cpu及主存),此时的这段空间的分配和释放过程是 此处需要关心和理解的,暂可以称为运行时的数据的内存区的分配, 首先运行时的数据区包括,程序计数器,以及Stack(虚拟机 栈),以及虚拟机堆,方法区,本地方法栈, 虽然运行时区域分配只要包含上述的描述组件,但实际运行中,程序计数器外,应该再加一个寄存器, 目前先描述上面5个,寄存器后面一并写入, 程序计数器: java中的多线程是通过线程轮流切换并分配处理器执行时间来实现的,再任何一个确定的时刻,一个处理器只会处理一条线程中的指令 ,因此,为了线程切换后能恢复到正确的执行位置, 每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响, 独立存储,我们称这一类内存区域为“线程私有”的内存区域,而程序计数器则是一块较小的内存,它的作用便是记录当前线程 所执行的字节码的行号指...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8