php中魔术变量解析

来源:互联网 发布:刷帮豆软件 编辑:程序博客网 时间:2024/06/05 11:17

为何叫魔力函数,或有的地方叫做魔幻函数。原因很简单,没有哪个语言能让你这么简单的把它从头到尾、从里到外如此方便和简单的完爆一遍。爆完之后,会让你有种把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
原创粉丝点击