孤独的猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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" 
} 

posted on 2013-09-14 21:08  孤独的猫  阅读(158)  评论(0)    收藏  举报