[開心學php100天]第四天:完爆php魔力函數


 

 

本期格言

當我們天資不夠強大時,與其花500%的精力做一個單線程技術高手,不如花較少的精力做一個聰明的多線程程序員。

本期扯淡

    湖南衛視的“我是歌手”第一季終結,歌王產生。也許很多人心目中的歌王都不一樣,但是不可否認的是,羽泉確確實實得到了“官方”宣布和“大家都認可”的歌王,我個人分析原因如下:

     其 實各個歌手實力都很強,各有特色,真沒有歌王不歌王之分。如獲得神給予天賦的林志炫、高音黃媽、全身都在搖滾的周曉鷗、細膩無比的楊宗緯以及其他各有特色 的歌手。但是我個人認為只有羽泉是最聰明的歌手,論音色也許比不過林志炫、論感人也許比不過楊宗緯、論高音高不過媽、論搖滾得剃光頭,所以羽泉采取的策略 是把自己融入觀眾,而不是強迫觀眾融入他們的歌。最終在制勝局拿出最猛的殺手鐧。

    這里還要寫一個經我加工過的神級分析:給羽泉投票時,喜歡 “羽”有一票,喜歡“泉”有一票,喜歡鄧超有一票,喜歡孫儷有一票,喜歡白百何有一票,支持3G天翼有一票,家里正在用立白洗衣液的有一票。因此羽泉的得 票不第一,實在是天理難容了。何況立白和天翼還是本節目贊助商。

    扯淡扯上程序員也一樣:當我們猛然出道時發現Java高手前輩實在太多了, 赤膊追趕也難以追上,畢竟人家的開發經驗放在那;再發現c#,這廝版本和功能升級的也太快了,裸體跟着學也難以全部掌握成為牛人;再看看python或者 ruby,學得好的人絕對是大牛而且是少數,學的不好的人基本上就是shit;因此我們不如學php,因為喜歡淘寶的有一票、喜歡mysql的有一票、喜 歡apache的有一票、喜歡wordpress的有一票、喜歡dz論壇的有一票、喜歡centos的有一票,不多說了,羽泉是歌王,我們何不想辦法成為 程序員之王呢。

 

正文:魔力函數

    為何叫魔力函數,或有的地方叫做魔幻函數。原因很簡單,沒有哪個語言能讓你這么簡單的把它從頭到尾、從里到外如此方便和簡單的完爆一遍。爆完之后,會讓你有種把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的程序必須首先了解這些魔幻函數。

 

php教程: http://www.shenyisyn.org/2013/04/13/php100_4.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM