沈逸老師PHP魔鬼特訓筆記(4)

来源:http://www.cnblogs.com/xz1024/archive/2016/08/29/5818675.html
-Advertisement-
Play Games

上一課我們通過shell腳本拷貝代碼,瞭解了靜態方法和靜態屬性。(還有個附件PHAR包,我直接無視了) 然後在GOD文件中寫了一些參數, 我們也可以這樣,把方法名像拼湊字元串一樣拼起來。 好,下麵我們還是按照老師課程,進行需求實現:如果參數帶“-”,那麼說明就是屬性。直接調用類的靜態屬性。如果不帶“ ...


上一課我們通過shell腳本拷貝代碼,瞭解了靜態方法和靜態屬性。(還有個附件PHAR包,我直接無視了)

然後在GOD文件中寫了一些參數,

  我們也可以這樣,把方法名像拼湊字元串一樣拼起來。

 $get_param=$argv[1];
 godinit::$get_param();

  好,下麵我們還是按照老師課程,進行需求實現:如果參數帶“-”,那麼說明就是屬性。直接調用類的靜態屬性。如果不帶“-”,那麼說明是方法,我們直接調用類的靜態方法。

  於是,我先把上節課寫過的god文件改成下麵這樣:

#!/usr/local/bin/php
<?php

require('god_func7');
require("godinit.php");

    $result='';
    if($argc>=2)
    {     
        /*'-v'==$argv[1]  && $result=godinit::$V;
        'make'==$argv[1]  && $result=godinit::make();
        'init'==$argv[1] && $result=godinit::init();*/
        $p = $argv[1];  //獲取參數
        if(substr($p,0,1)=='-')     //  代表獲取並匹配變數,
        {
          //如果傳過來的是-v,就會變成v
          $p = substr($p,1);
           $result = godinit::$$p;
        }else{
            $result = godinit::$p();
        }
    }
echo $result;
echo PHP_EOL;
?>

  結果如下圖:

  

  

  我們回到上面的命令行,如果隨便輸出一個非-v的字元,就會出現錯誤,所以我們還需要把代碼完善下。 

$p = $argv[1];  //獲取參數
if(substr($p,0,1)=='-')     //  代表獲取並匹配變數,
    {
      //如果傳過來的是-v,就會變成v
        $p = substr($p,1);
        $result =isset(godinit::$$p)?godinit::$p:error;
    }else{
        $result = godinit::$p();
    }  

  這裡我們將要用到一個PHP魔法函數 __callStatic($m,$args) 。這個方法如果你要用,必須寫到類裡面,且必須是static。它的作用是,如果你調用了一個未定義的靜態方法,則會自動觸發這個函數。 第一個參數是 方法名,第二個參數是方法參數。我們可以用它來做一個容錯處理(只要學到這個地步),在godinit文件中,我們加入這個方法:

static function __callStatic($p1,$p2){
    echo '$p1';
}

  然後,我們看看結果:

  

  現在再來看一般類定義和實例化以及調用,在我們新建一個godconfig文件,創建一個只有屬性的godconfig類

<?php
class godconfig
{
    public $prj_name;
    public $prj_author;
    
}
?>

  在godinit里的實例化類godconfig,使用 1、json_encode(實例化過後的類):返回一個json格式的字元串 2、json_decode(json字元串) : 返回一個對象。

<?php

require('godconfig.php');                //引入gonconfig這個文件
class godinit                           //創建一個類,godinit
{
    static  $v="god version is 1.2";     //聲明一個靜態屬性$VERSION

    static function init()               //靜態方法 init
    {
        $gc = new godconfig();          //實例化godconfig里定義的類
        echo "input your project name?".PHP_EOL;
        $gc -> prj_name = fgets(STDIN);            //從標準輸入中獲取用戶輸入的字元並賦值給實例化屬性$prj_name

        echo "input your author name?".PHP_EOL;
        $gc -> prj_author=fgets(STDIN);

        $ret = array();                 //初始化一個數組;
        $ret[] = $gc;
        echo json_encode($ret);
        //return ""
    }
    static function __callStatic($p1,$p2){
        echo "error function";
    }
}
?>

  然後我們看結果:

  

 

 

惡補幾個簡單的知識點:

()?():();

substr();

isset();

__callStatic($m,$args) 

json_encode()

json_decode() 

 

版權聲明:筆記整理者亡命小卒熱愛自由,崇尚分享。但是本筆記源自www.jtthink.com(程式員在囧途)沈逸老師的《 PHP魔鬼訓練課第一階段》。本學習筆記小卒於博客園首發, 如需轉載請尊重老師勞動,保留沈逸老師署名以及課程來源地址。

 

上一課:沈逸老師PHP魔鬼特訓筆記(3)

 

下一課:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •  Django 中的 csrf_token 與單元測試 在 "《Python Web開發:測試驅動方法》" 一書中作者使用的 Django 版本是 1.7,而我使用的是1.9.7版(官網已經更新到1.10了)。這就導致書中給出的代碼可能有“過時”的部分。 比如,下麵是第三章一個單元測試 的代碼,運 ...
  • 題目描述有以下幾個問題:1 給定正整數 求方程 的最小非負整數解。2 給定正整數 求方程 的最小非負整數解。3 給定正整數 求方程 在模 意義下解的數量。4 給定正整數 求 的值。其中 是歐拉函數, 是莫比烏斯函數。輸入格式輸入文件共四行,按上述描述中四個問題的順序,給出每個問題。第一行三個正整數 ... ...
  • 初衷:本人初學SpringMVC的時候遇到各種稀奇古怪的問題,網上各種技術論壇上的帖子又參差不齊,難以一步到位達到配置好的效果,這裡我將我配置的總結寫到這裡供大家初學SpringMVC的同僚們共同學習使用! ...
  • 因為打算全屏顯示一個對話框,而對話框內有幾個QLabel的尺寸要在確定QLabel可用的最大尺寸後,再根據內容調整一次,所以在對話框構造函數內就想確定QLabel的最大尺寸,但因為QWidget::updateGeometry()和QWidget::update()都只能用於可見的控制項,所以如何在控 ...
  • 學習地址:http://www.rm5u.com/ 或 http://www.runoob.com/ iPhone或iTouch的寬為320像素,高為480像素,狀態欄高為20像素,toobar高為44像素,tabbar高為49像素,導航欄高為44像素。 typealias:類型別名對當前的類型定義 ...
  • thinkphp配置文件路徑在入口文件index.php中配置。 如果Public目錄在應用程式目錄同等級位置: 2.如果Public在app內部則: 3.如果使用Public在app外部,但定義為: ...
  • "390. Elimination Game題解" 隨便寫幾個小例子查看,發現每次數字個數減少一半,每一層的數之間的間隔相等,然後考慮模擬刪除過程,需要記錄如下幾個變數 1. 每一層的第一個數 2. 當前層的數字個數 3. 當前層每兩個數字的間隔 然後依次模擬刪除,當個數只剩一個的時候返回,然後考慮 ...
  • 一般來說,字元串、數組、資料庫類的函數是相對來使用比較多的類別。// 時間日期 //y返回年最後兩位,Y年四位數,m月份數字,M月份英文。d月份幾號數字,D星期幾英文$date=date("Y-m-d");//include,include_once.require,require_once//re ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...