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