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