Home >Backend Development >PHP Tutorial > PHP中的幻术变量小结

PHP中的幻术变量小结

WBOY
WBOYOriginal
2016-06-13 13:04:44880browse

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 "
";
     echo "This is function b";
     echo "
";
     echo __METHOD__;
   }
}
$cm = new Magicconstant();
$cm->b();

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

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

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

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_用在将类序列化之前,
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
}

}
?>
$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_
用在反序列化时:
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"."
";
}

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

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

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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn