上一課我們透過shell腳本拷貝程式碼,了解了靜態方法和靜態屬性。 (還有附件PHAR包,我直接無視了)
然後在GOD檔案中寫了一些參數,
我們也可以這樣,把方法名稱像拼湊字串一樣拼起來。
<span style="color: #800080;">$get_param</span>=<span style="color: #800080;">$argv</span>[1<span style="color: #000000;">]; godinit</span>::<span style="color: #800080;">$get_param</span>();
好,下面我們還是按照老師課程,進行需求實現:如果參數帶“-”,那麼說明就是屬性。直接調用類別的靜態屬性。如果不帶“-”,那麼說明是方法,我們直接呼叫類別的靜態方法。
於是,我先把上課寫過的god檔改成下面這樣:
<span style="color: #008000;">#</span><span style="color: #008000;">!/usr/local/bin/php</span> <?<span style="color: #000000;">php </span><span style="color: #0000ff;">require</span>('god_func7'<span style="color: #000000;">); </span><span style="color: #0000ff;">require</span>("godinit.php"<span style="color: #000000;">); </span><span style="color: #800080;">$result</span>=''<span style="color: #000000;">; </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$argc</span>>=2<span style="color: #000000;">) { </span><span style="color: #008000;">/*</span><span style="color: #008000;">'-v'==$argv[1] && $result=godinit::$V; 'make'==$argv[1] && $result=godinit::make(); 'init'==$argv[1] && $result=godinit::init();</span><span style="color: #008000;">*/</span> <span style="color: #800080;">$p</span> = <span style="color: #800080;">$argv</span>[1]; <span style="color: #008000;">//</span><span style="color: #008000;">获取参数</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">substr</span>(<span style="color: #800080;">$p</span>,0,1)=='-') <span style="color: #008000;">//</span><span style="color: #008000;"> 代表获取并匹配变量,</span> <span style="color: #000000;"> { </span><span style="color: #008000;">//</span><span style="color: #008000;">如果传过来的是-v,就会变成v</span> <span style="color: #800080;">$p</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$p</span>,1<span style="color: #000000;">); </span><span style="color: #800080;">$result</span> = godinit::$<span style="color: #800080;">$p</span><span style="color: #000000;">; }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #800080;">$result</span> = godinit::<span style="color: #800080;">$p</span><span style="color: #000000;">(); } } </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$result</span><span style="color: #000000;">; </span><span style="color: #0000ff;">echo</span> <span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span>?>
結果如下圖:
我們回到上面的命令行,如果隨便輸出一個非-v的字符,就會出現錯誤,所以我們還需要把程式碼完善下。
<span style="color: #800080;">$p</span> = <span style="color: #800080;">$argv</span>[1]; <span style="color: #008000;">//</span><span style="color: #008000;">获取参数</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">substr</span>(<span style="color: #800080;">$p</span>,0,1)=='-') <span style="color: #008000;">//</span><span style="color: #008000;"> 代表获取并匹配变量,</span> <span style="color: #000000;"> { </span><span style="color: #008000;">//</span><span style="color: #008000;">如果传过来的是-v,就会变成v</span> <span style="color: #800080;">$p</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$p</span>,1<span style="color: #000000;">); </span><span style="color: #800080;">$result</span> =<span style="color: #0000ff;">isset</span>(godinit::$<span style="color: #800080;">$p</span>)?godinit::<span style="color: #800080;">$p</span>:<span style="color: #000000;">error; }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #800080;">$result</span> = godinit::<span style="color: #800080;">$p</span><span style="color: #000000;">(); }</span>
這裡我們將要用到一個PHP魔法函數 __callStatic($m,$args) 。這個方法如果你要用,必須寫到類別裡面,而且必須是static。它的作用是,如果你呼叫了一個未定義的靜態方法,則會自動觸發這個函數。 第一個參數是 方法名,第二個參數是方法參數。我們可以用它來做一個容錯處理(只要學到這個地步),在godinit檔案中,我們加入這個方法:
<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> '$p1'<span style="color: #000000;">; }<br></span>
然後,我們來看看結果:
現在再來看一般類定義和實例化以及調用,在我們新建一個godconfig文件,創建一個只有屬性的godconfig類
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> godconfig { </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$prj_name</span><span style="color: #000000;">; </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$prj_author</span><span style="color: #000000;">; } </span>?>
在godinit裡的實例化類別godconfig,使用 1、json_encode(實例化過後的類別):傳回一個json格式的字串 2、json_decode(json字串) : 傳回一個物件。
<?<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: #800080;">$gc</span> = <span style="color: #0000ff;">new</span> godconfig(); <span style="color: #008000;">//</span><span style="color: #008000;">实例化godconfig里定义的类</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: #800080;">$gc</span> -> prj_name = <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: #800080;">$gc</span> -> prj_author=<span style="color: #008080;">fgets</span><span style="color: #000000;">(STDIN); </span><span style="color: #800080;">$ret</span> = <span style="color: #0000ff;">array</span>(); <span style="color: #008000;">//</span><span style="color: #008000;">初始化一个数组;</span> <span style="color: #800080;">$ret</span>[] = <span style="color: #800080;">$gc</span><span style="color: #000000;">; </span><span style="color: #0000ff;">echo</span> json_encode(<span style="color: #800080;">$ret</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">return ""</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>?>
然後我們看結果:
惡補幾個簡單的知識點:
()? ():();
substr();
isset();
__callStatic($m,$args)
json_encode()
json_decode()
版權聲明:筆記整理者亡命小卒熱愛自由,崇尚分享。但這篇筆記源自www.jtthink.com(程式設計師在囧下)沈逸老師的《 PHP魔鬼訓練課第一階段》。本學習筆記小卒於博客園首發, 如需轉載請尊重老師勞動,保留沈逸老師署名以及課程來源地址。
上一課:沈逸老師PHP魔鬼特訓筆記(3)
下一課: