zoukankan      html  css  js  c++  java
  • PHP几种常见魔术方法与魔术变量解析

    原文地址:http://small.aiweimeng.top/index.php/archives/49.html

    先不多说,直接上代码,如下:

     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:phpstudyPHPTutorialWWWphpDemo3-08.php
    G:phpstudyPHPTutorialWWWphpDemo
    demo
    appTest
    appTest::demo
    app
    appHelloWorld
  • 相关阅读:
    读《见识》 | 当别人扇了你一巴掌
    Java集合类
    Java数据结构简述
    Java加密算法
    Java JDK与JRE
    Java String、StringBuilder、StringBuffer[笔记]
    Java同步(Synchronization)
    Java断言(Assertion)
    Java strictfp
    Java Native Interface(JNI)
  • 原文地址:https://www.cnblogs.com/smallKilts/p/10499416.html
Copyright © 2011-2022 走看看