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