php中魔术变量解析

为何叫魔力函数,或有的地方叫做魔幻函数。原因很简单,没有哪个语言能让你这么简单的把它从头到尾、从里到外如此方便和简单的完爆一遍。爆完之后,会让你有种把php 完完全全征服的感觉。这种感觉在java中是很难找到的,c#呢?oh,谈都不用谈吧。

(一)、 __construct 构造函数

    构造函数的意思代表,它是第一个被爆的函数,不管你想不想爆,反正它会自动爆。

class  test
        {
            function  __construct()
             {
                   echo  '自爆第一次' ;
              }
             function  mydo()
            {
                   echo  '手动爆一次' ;
            }
      }
 
  $newObj  = new  test();
  $newObj ->mydo();

 

  运行结果,是自爆第一次(不管你想不想),然后才会爆第二次。

   这里有个知识点是:传参数也很简单,你可以__construct($arg1,$arg2);

     同理也可以用 func_get_args这个函数来得到未知个数的参数。譬如

class  test
        {
            function  __construct()
             {
                 $getargs =func_get_args();
                 if ( count ( $getargs )<2)
                   exit ( "参数必须有二个" );
              }
             function  mydo()
            {
                   echo  "手动爆一次" ;
            }
      }
 
  $newObj  = new  test( "aaa" ); //构造函数中$getargs[0] 的值就是aaa
  $newObj ->mydo();

 

     注意,用了exit,则mydo方法则不会运行,也就是你想手动爆是不可能的了。类似于c#的response.end。

    这个构造函数的用法大部分被用在类继承上,也可以直接用在页面输出内容上,根据参数的个数来加载不同的内容。

(二)、__destruct() 析构函数

     析构函数原则上的解释是:当删除一个对象或对象操作终止的时候,自动的调用该方法,所以可进行释放资源之类的操作。

      实 际上咱不要想太多,用了php,根本不需关注此函数。资源释放一切由zend负责,而且php也不适合在类里面做大数据量超级循环的事情,否则那真是自爆 了。一般实际项目中,会通过继承的方式做一些日志的记录等小小的事情。如果有百万级数据要在你的类处理,要么说明你接到大项目你要发了,要么就是咱在做 梦。

(三)、__autoload 自动加载

这个函数只有一个地方用得着。就是 自动加载函数文件。

 
class  水果
        {
            function  __construct($用户的选择)
             {
                 if ($用户的选择==1)
                   $苹果的对象= new  苹果(); //这里会自动加载一个 啃苹果需要的函数.php
                  else
                  $榴莲= new  榴莲();     //这里就不会加载 多余的php文件
             }
      }
      class  榴莲
      {
         //太臭,但是我爱吃
      }
      class  苹果
      {
          //不臭,但是我不爱吃
             function  __autoload()
              {
                 require ( "啃苹果需要的函数.php" );
              }
      }
 
$newObj  = new  水果(1);

 

上述列子请勿直接拷贝运行,搞成中文是为了更容易看懂。

(四)、__call

调用不存在的类的函数的时候得处理方法,__call 失败,就调用父类方法,依此类推。

这个函数个人认为是php最给力的函数。由此可以写出很亮的代码 譬如:

   class  data
   {
     function  __call( $name , $arguments )
     {
         //$name代表方法名 $arguments代表参数
        if ( $name == "getSqlServer" )
        {
          // 执行sqlserver相关的sql语句
       
        else
        {
          //执行mysql相关的sql语句
        }
 
     }
   }
 
$newObj  = new  data();
$newObj ->getSqlServer( "select top 10 * from table1" );
  $newObj ->getMysql( "select  * from table1 limit 0,10" ); //注意mysql是没有 top n的语法的
  当然上面是一个列子,大家可以举一反三,在数据层,业务层都可以使用,尤其在构建一个虚拟实体或虚拟类时可以实现可配置化很高的代码写法。

(五)、__get 、__set

当属性未定义时,get或者set时,会自动调用

class  data
   {
 
     function  __get( $name ) //$name 代表属性名
      {
         if ( $name == "H7N9" //变量为H7N9没有定义它,则调用__get,定义了,则不会进入
           return  "禽流感" ;
         else
           return  "不要扯淡" ;
      }
 
   }
 
$newObj  = new  data();
echo  $newObj ->H7N9;
echo  $newObj ->H100N30;

 

用这个办法,依然可以写出很亮的代码

(六)、__clone()

当对象被克隆时,执行的函数

class  data
   {
       var  $myname = "shenyisyn" ;
      function  __clone()
      {
         $this ->myname= "假的shenyisyn" ;
      }
   }
$newObj  = new  data();
echo  $newObj ->myname;
$obj2 = clone  $newObj ;
echo  $obj2 ->myname;

 

这个函数实际项目中也有,譬如做新闻网站,某个新闻的类叫做news, 用户可能会复制一条同样的新闻进行采集,此时我们可以在__clone()函数中,对某些标识值进行处理。如

class  news
   {
       var  $newsid =1;
      function  __clone()
      {
       //在数据库中执行 ID为1的新闻,让其被引用或者采集字段加+1
      }
   }
$newObj  = new  news();
$news2 = clone  $newObj ; //终于有外站用户来采集我站新闻了,我好欢喜

 

(七)、__toString()

用法看例子直接明了

class  news
   {
      var  $newstitle = "美国国务卿克里抵京访华" ;
      function  __toString()  //不加这个函数,则会出现 对象无法按字符串输出
      {
         return  "这是一个新闻对象,我只能给你一个标题" ;
      }
   }
$newObj  = new  news();
  echo  $newObj ; //额。。手误了,忘记这货不是一个字符串,不过照样可以爆出来

 

(八)、__sleep、 __wakeup

这个函数只在类被序列化或者反序列化时自动调用。看

class  news
   {
      var  $user1 = "卞工" ;
      var  $user2 = "猪刚烈" ;
      var  $user3 = "学姐" ;
 
      function  __sleep()
      {
         echo  "学姐是保密的,不会让你序列化" ;
         return  array ( "user1" , "user2" ); //user1和user2 必须和上面定义的变量名是一致的。
 
      }
   }
$newObj  = new  news();
  $obj =serialize( $newObj );
 
  var_dump( $obj );

 

以上为魔幻函数,实际上这是php最亮的部分没有之一。

要在后期实际项目中写出很man的程序必须首先了解这些魔幻函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值