接上一堂課,我們專門新建了一個godconfig類,設定了兩個屬性prj_name(項目名稱),prj_author(作者),然後我們取得標準輸入(stdin)把結果保存在了類別裡面。
好吧,這節課的名字比較奇葩-我得了”懶癌”,假如我們忘記寫godconfig類的屬性,我們的程式還會運行嗎?答案是依舊可以,PHP會自動為你的類別增加屬性(這是老師PPT原話)。
GOON,繼續懶得下去,現在godconfig類別都不想創建了。這裡我們用到$gc = new stdClass();
前面這個點很簡單,我就不貼程式碼和運行結果了。
下面,我們有另一個實戰需求:我們在函數檔案裡寫一個方法,functionTC() //temp class的意思(這名字都是老師隨意的)。代表傳回一個臨時類別。
第一種寫法:
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">require</span>('godconfig.php'); <span style="color: #008000;">//</span><span style="color: #008000;">引入gonconfig这个文件</span> <span style="color: #0000ff;">class</span> godinit <span style="color: #008000;">//</span><span style="color: #008000;">创建一个类,godinit</span> <span style="color: #000000;">{ </span><span style="color: #0000ff;">static</span> <span style="color: #800080;">$v</span>="god version is 1.2"; <span style="color: #008000;">//</span><span style="color: #008000;">声明一个静态属性$VERSION</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> init() <span style="color: #008000;">//</span><span style="color: #008000;">静态方法 init</span> <span style="color: #000000;"> { </span><span style="color: #008000;">//</span><span style="color: #008000;">$gc = new godconfig(); //实例化godconfig里定义的类 //$gc = new stdClass();</span> <span style="color: #0000ff;">echo</span> "input your project name?".<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">$gc -> prj_name = fgets(STDIN); //从标准输入中获取用户输入的字符并赋值给实例化属性$prj_name <span style="color: #800080;">$prj_name</span> = <span style="color: #008080;">fgets</span>(STDIN); <span style="color: #008000;">//</span><span style="color: #008000;">重新获取用户输入,并赋值给$prj_name</span> <span style="color: #0000ff;">echo</span> "input your author name?".<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">$gc -> prj_author=fgets(STDIN);</span> <span style="color: #800080;">$prj_author</span> = <span style="color: #008080;">fgets</span>(STDIN); <span style="color: #008000;">//</span><span style="color: #008000;">重新获取用户输入,并赋值给$prj_author</span> <span style="color: #0000ff;">echo</span> json_encode(TC(<span style="color: #0000ff;">array</span>('prj_name'=><span style="color: #800080;">$prj_name</span>,'prj_author'=><span style="color: #800080;">$prj_author</span><span style="color: #000000;">))); }</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> __callStatic(<span style="color: #800080;">$p1</span>,<span style="color: #800080;">$p2</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">echo</span> "error function"<span style="color: #000000;">; } } </span>?>
同時,我們在god_func7這個檔案中,寫一個TC方法:
<?<span style="color: #000000;">php </span><span style="color: #008000;">//</span><span style="color: #008000;">functions for PHP7</span> <span style="color: #0000ff;">function</span> genConfig(<span style="color: #800080;">$cnt</span>):<span style="color: #0000ff;">string</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">file_put_contents</span>(<span style="color: #008080;">getcwd</span>().'/god.json',<span style="color: #800080;">$cnt</span>).' of bytes is written.'.<span style="color: #ff00ff;">PHP_EOL</span>.'god config is created'<span style="color: #000000;">; } </span><span style="color: #0000ff;">function</span> TC(<span style="color: #800080;">$p</span><span style="color: #000000;">){ </span><span style="color: #ff0000;">$get_class = new</span><span style="color: #000000;"><span style="color: #ff0000;"> stdClass();</span> </span><span style="color: #ff0000;">foreach ($p as $k => $v){ $get_class -> $k=$v; } return $get_class<span style="color: #000000;"><span style="color: #ff0000;">;</span> }</span>
然後我們看下結果,還是和原來的寫法得到的結果一毛一樣:
OK,現在可以實作godconfig都不用建置了。
還有第二種寫法:我懶球得記了。好吧,這才是真正的懶。
第三種寫法,和PHP7匿名類有關。
PHP中的建構子是__construct(參數) {} ,類別在實例化的時候會先執行這個函式。接下來我們來看PHP7 的匿名類別(其實沒啥神秘,所謂匿名就是沒名字而已).只不過區別在於,如果匿名類別要使用外部變量,需要傳進去,否則無法使用。
<?<span style="color: #000000;">php </span><span style="color: #008000;">//</span><span style="color: #008000;">functions for PHP7</span> <span style="color: #0000ff;">function</span> genConfig(<span style="color: #800080;">$cnt</span>):<span style="color: #0000ff;">string</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">file_put_contents</span>(<span style="color: #008080;">getcwd</span>().'/god.json',<span style="color: #800080;">$cnt</span>).' of bytes is written.'.<span style="color: #ff00ff;">PHP_EOL</span>.'god config is created'<span style="color: #000000;">; } </span><span style="color: #0000ff;">function</span> TC(<span style="color: #800080;">$p</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">class</span>(<span style="color: #800080;">$p</span>){ <span style="color: #008000;">//</span><span style="color: #008000;">this is 匿名类</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$p</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$p</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$k</span> => <span style="color: #800080;">$v</span><span style="color: #000000;">){ </span><span style="color: #800080;">$this</span> -> <span style="color: #800080;">$k</span> = <span style="color: #800080;">$v</span><span style="color: #000000;">; } } }; }</span>
其實上面這個一點都不懶,寫這麼多代碼^_^;
還是看看結果吧:
版權聲明:筆記整理者亡命小卒熱愛自由,崇尚分享。但這篇筆記源自www.jtthink.com(程式設計師在囧途)沈逸老師的《 PHP魔鬼訓練課第一階段》。本學習筆記小卒於博客園首發, 如需轉載請尊重老師勞動,保留沈逸老師署名以及課程來源地址。
惡補知識點:
1、stdClass:PHP內建頂層類,實際上是一個基類,空白的。啥都沒有。如果你臨時用的,其他地方很少用。那麼根本不需要新建什麼實體類別。直接new 一個stdClass就可以了。
2、foreach遍歷數組
3、匿名類: