• PHP中的魔术变量小结


    PHP中的魔术变量小结

    PHP中,有不少很好用的魔术变量,用好之,能事半功倍,下面小结之:


    1 _LINE_
      显示当前代码的行数:
      echo "This is line number : ". __LINE__;

    2 _FILE_
       显示当前文件的路径

    3 _METHOD_
       显示当前方法的名,比如
       class Magicconstant
    {
        function __construct()
        {
          echo "This is function a";
        }
        function b()
       {
         echo "<br/>";
         echo "This is function b";
         echo "<br/>";
         echo __METHOD__;
       }
    }
    $cm = new Magicconstant();
    $cm->b();

    显示
       This is function a
      This is function b
      Magicconstant::b

    4 _FUNCTION_
       显示当前所在函数的名
      function b()
      {
      echo "<br/>";
    echo "This is function b";
    echo "<br/>";
    echo __FUNCTION__;
      }
    输出:
       This is function b
    Magicconstant::b

    5 _DIR_
       显示当前目录名,如
      echo "The directory name is : ". __DIR__;
    输出:
      The directory name is : D:wampwww

    6 _CLASS_
       显示当前的类
    class Magicconstant
    {
    function __construct()
    {
    echo "The class name is : ".__CLASS__;
    }
    }
    $cm = new Magicconstant();
      显示:
      The class name is : Magicconstant

    7 _NAMESPACE_
       显示当前命名空间
    namespace MagicConstant
    {
       echo "The namespace is : ".__NAMESPACE__;
    }
    输出:
      The namespace is : MagicConstant

    8 _sleep_
      _sleep_用在将类序列化之前,
    <?php
    class User
    {
    public $userName = '';
    public $userAddress = '';
    public $userPhone = '';

    public function setName($name='')
    {

    $this->userName = $name;
    }

    function setAddress($address='')
    {
    $this->userAddress = $address;
    }

    function setPhone($phone='')
    {
    $this->userPhone = $phone;
    }

    function __sleep()
    {
    return array('userAddress','userPhone');
                            // This will serialize only address and Phone number but not Name
    }

    }
    ?>
    <?php
    $User = new User();
    $User->setName('Avinash');
    $User->setAddress('Address Here');
    $User->setPhone('1234567890');

    $serialData = serialize($User);
    echo $serialData;
    ?>

    OutPut: O:4:"User":2:{s:11:"userAddress";s:12:"Address Here";s:9:"userPhone";s:10:"1234567890";}

    程序运行时, serialize() 检查类中是否有 __sleep() ,如果有,则该函数将在任何序列化之前运行. 该函数必须返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性. 该函数有两个作用: 第一. 在序列化之前,关闭对象可能具有的任何数据库连接等. 第二. 指定对象中需要被序列化的成员属性,如果某个属性比较大而不需要储存下来,可以不把它写进__sleep()要返回的数组中,这样该属性就不会被序列化


    又如:
    class Test {

    public $mySecret; //我的秘密不想让人知道

    public function __construct($secret) {

    $this->mySecret = $secret;

    }

    public function __sleep() {

    $this->mySecret = "你休想知道我的秘密!";

    return array('mySecret'); //一定要返回变量,不然返回的是个空,所以序列化也就没有东西了。

    }

    }

    $test = new Test("我的心里话 我爱某某某");

    echo serialize($test); //输出 O:4:"Test":1:{s:8:"mySecret";s:28:"你休想知道我的秘密!";}


    _wakeup_
    用在反序列化时:
    <?php
    class User
    {
    public $userName = '';
    public $userAddress = '';
    public $userPhone = '';

    public function setName($name='')
    {

    $this->userName = $name;
    }

    function setAddress($address='')
    {
    $this->userAddress = $address;
    }

    function setPhone($phone='')
    {
    $this->userPhone = $phone;
    }

    function __sleep()
    {
    return array('userAddress','userPhone');
                           // This will serialize only address and Phone number but not Name
    }

    function __wakeup()
    {
    echo "In Wakeup function"."<br/>";
    }

    }
    ?>
    <?php
    $User = new User();
    $User->setName('Avinash');
    $User->setAddress('Address Here');
    $User->setPhone('1234567890');

    $serialData = serialize($User);
    echo $serialData;
    echo "<br/>";
    var_dump(unserialize($serialData));
    ?>

    Output:
    In Wakeup function
    object(User)#2 (3) {
      ["userName"]=>
      string(0) ""
      ["userAddress"]=>
      string(12) "Address Here"
      ["userPhone"]=>
      string(10) "1234567890"
    }

  • 相关阅读:
    如何用grep命令同时显示匹配行上下的n行 (美团面试题目)
    Maven面试宝典
    Java经典设计模式 总览
    Java设计模式之工厂模式
    Java设计模式
    三次握手,四次挥手 具体发送的报文和状态都要掌握(阿里)
    运动与饮食结合
    健身计划
    Java中的多线程=你只要看这一篇就够了
    js禁止复制粘贴
  • 原文地址:https://www.cnblogs.com/shsgl/p/3985376.html
Copyright © 2020-2023  润新知