您的位置:首页 > 编程语言 > PHP开发

PHP中的魔术变量小结

2015-08-12 11:00 288 查看
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"

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: