您现在的位置是:首页 > 文章详情

PHP几种常见魔术方法与魔术变量解析

日期:2019-03-08点击:346

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
复制代码

 

复制代码
原文链接:https://yq.aliyun.com/articles/692934
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章