java學習php(一)基礎知識

1. 四種不同的開始結束標記

只有<?php ?>、<script language="php"></script>兩個總是可用,剩下的<? ?>、<% %>需要在php.ini中配置。即分別開啓php.ini中的short-open-tag和asp-tags即可,默認情況下,它們被禁用,而且移植性較差,不推薦使用。

2. 指令分隔符“分號”

末尾的php代碼段後面的“;”也可以不要,當使用輸出緩衝和include()或者require()省略會更好。

3. 註釋

書寫恰當的註釋是一種良好的習慣。php註釋包括多行註釋“/* */”,單行註釋“//”與“#”,多行註釋之內不能嵌套另一個多行註釋,其他情況隨意搭配都可。

4. 空行

空行可以展示代碼層次的美感。比如一個源文件的兩個代碼片段使用兩個空行,兩個類的聲明之間也是用兩個空行。比如,兩個函數聲明之間用一個空行,函數內局部變量與第一條語句之間用一個空行,塊註釋或單行註釋之前還有一個函數內的兩個邏輯代碼段之間都是用一個空行。運用空格的情況有,參數列表的逗號後面空格,運算符與操作數之間,for語句表達式逗號後面等。

5.變量

php最基本的存儲單元是變量和常量,可以存儲不同類型的數據。由於它是弱類型語言,變量的數據類型由上下文或者運行時決定。

5.1 變量聲明

     “$”後跟變量名,並用“=”賦值,當第一次給一個變量賦值,才創建了這個變量(只是聲明,沒賦值呢?)。大部分變量如果不是在函數內部聲明的,只有在聲明處到文件結束的一個單獨的範圍使用。這裏的單獨範圍不僅包含<?php 到?>,他可以在一個頁面的所有開啓的php模式下使用,也包含用include和require引入的文件。如果使用cookie或session則還可在更多的頁面使用。

      可使用unset()釋放指定的變量,使用inset()檢測變量是否已設置(存在聲明),使用empty()檢查是否爲空。

5.2 變量命名

      變量名區分大小寫,但是內置結構和關鍵字以及用戶自定義的類名和函數名卻不區分大小寫。變量名以字母下劃線開頭,後面是任意的字母,數字,下劃線。

5.3 可變變量

      可將一個已定義的變量的值作爲另一個變量的名字,如:hi="hello";hi="hello";hi="world";echo"hi="world";則echo"hi hello""hello"與"hi {{hi}"結果都是”hello world“。

5.4 變量的引用賦值

      即在變量名前加“&”,相當於c中的取址操作,將變量地址賦給兩一個變量,兩個變量共同指向同一個值。只有有名字的變量纔可以進行取址賦值,形如(3*9)或函數返回的值都不能。

6. 變量的類型

強類型語言在定義變量或常量前需要指定類型,而php是弱類型語言,具體類型取決於應用時的上下文。

6.1 類型介紹

      php支持8種原始類型和一些僞類型。原始類型如下:

  四種標量類型 boolean(布爾型)
  integer(整形)
  float(浮點型,也稱double)
  string(字符型)
數據類型 兩種複合類型 array(數組)
  object(對象)
  兩種特殊類型 resource(資源)
  NULL

      變量類型由上下文決定,可以使用var_dump()查看某變量的類型和值。

6.2 布爾型

      php中進行關係運算或邏輯運算時返回的都是布爾值。下列情況下的值,默認爲是布爾值中的false:

布爾值false,0,0.0,空白字符串或“0”,沒有成員變量的數組,沒有單元的對象(適用於php4),特殊類型null(包括尚未設定的變量)。

6.3 整形

      整形字長和平臺有關。可用“+”,“-”表示正負,整數可省略“+”;可以用“0”和“0x”指定八進制或十六進制,但是結果都是以十進制輸出;不支持無符號整數,最大整數爲2 147 483 647,最小爲-2 147 483 647,超出則按照float類型處理。

6.4 浮點型(float或double)

      浮點數字長也和平臺有關。範圍在1.7E-308~1.7E+38,精確到小數點後15位。它只是一種近似的值,永遠不可能精確到最後一位,如表示8,內部表示爲7.9999999...。也因此,無法表示兩個浮點數是否相等,即使是字面量相等的兩個浮點數,內部表示也不一樣,導致比較的結果出人意料。此時可使用任意精度數學函數或gmp()函數。

6.5 字符串

      字符串長度沒有限制,可以使用單引號,雙引號,定界符三種字面上的方法定義,但是它們具有功能上的差異。

6.5.1 單引號

      單引號內可使用轉義字符“\”轉義單引號和轉義字符本身,不能轉義其他特殊字符,否則原樣輸出。出現在單引號內的變量也不會被變量值取代,只是將變量名輸出。使用單引號定義字符串時效率最高,因爲省去了php解析時的字符處理轉換和變量解析的開銷。

6.5.2 雙引號

      可轉義更多特殊字符,可解析字符串中的變量,可使用{}將變量名分離出來再解析(“{beer}s” 或 “{{beer}s” 或 “{beer}s”)。

6.5.3 定界符

      $string<<<EOT  /文本/  EOT; 結束處的EOT頂頭第一列寫,後面只能跟着分號作爲結束。

6.6 數組

php中的數組實際是一個有序圖,把values映射到keys,values可以是任何php允許的類型值。

6.7 對象

和其他面嚮對象語言類似的對象類型,不過在聲明使用細節上有差異。

6.8 資源類型

資源類型保存了一個到外部資源的引用,通過專門的函數建立並使用,保存有打開文件,數據庫連接,圖形畫布區域等的特殊句柄,並由程序員創建,使用,釋放。

6.9 null

      null表示一個變量沒有值,null類型唯一可能的值就是null,null不表示空格,不表示零,也不是空字符串,而是表示一個變量值爲空。不區分大小寫,一下情況變量視爲null:將變量直接賦值null,聲明的變量尚未賦值,使用unset()銷燬的變量。

6.10 僞類型

mixed

number

callback

6.11 數據類型之間的轉化

自動類型轉換

強制類型轉換

變量類型測試函數:is_boolean(),is_int()等。

7. 常量

      常量是一個簡單值的標識符,腳本執行期間,一旦定義就不能被改變或取消定義。作用域是全局的,可在腳本任何地方聲明和訪問。常量只能包含類型如boolean,integer,string,float幾種標量數據。

7.1 定義和使用

      默認大小寫敏感,通常使用大寫,但是不加$,使用define()函數定義,如define(string name,mixed value[,boolean case_insensitive])。第一個參數是名稱,第二個是值,第三個可選,表示是否大小寫敏感。可使用defined()檢查是否定義了某常量。

7.2 常量和變量的區別

• 常量前沒有$

• 只能用define()定義,不能通過賦值語句

• 不用理會變量範圍的規則而在任何地方定義使用

• 一旦定義就不能重定義或取消定義

• 值只能是特定的標量

7.3 預定義常量

      php中預定義了一系列常量,不區分大小寫,可在程序中直接使用完成一些特殊功能。它們有不同的擴展庫定義,使用前應加載這些庫。有些常量根據使用的位置而變,如_LINE_根據在腳本中的行來決定。

8. 運算符

算數運算符(+,-.*,/,%,++,--)

字符運算符(.) 可連接字符,相當於java中的"+"。

賦值運算符(=,+=,-=,*=,/=,%=,.=)

比較運算符(>,<,>=,<=,==,===,<>/!=,!==)

邏輯運算符(and/&&,or/||,not/!,xor)

位運算符(&,|,^,~,<<,>>)

其他運算符(?:,‘‘,@,=>,->,instanceof)

優先級

9.表達式

簡單定義表達式概念就是"任何有值的東西",無值可視爲聲明。

10. php的語言結構

任何語言都有三種結構:順序,分支,循環。

分支結構

if、if...else...、if...elseif...else...、switch case...

循環結構

while、do...while、for

特殊控制語句

break、continue、exit(只要執行到exit(),無論它在那個結構都會直接退出當前腳本die()是exit()的別名,可帶參數輸出一條信息並退出)。

11. php的函數

11.1 函數定義

      函數是一個被命名的、獨立的代碼段,執行特定任務,並可能返回一個值。

11.2 自定義函數

定義

function fname(參數列表){

  語句;

  return ;

}

調用

如果函數不被調用就不會執行。函數名稱有三個作用:

• 通過函數名稱調用函數

• 用來傳遞參數

• 代表返回值

參數

返回值

11.3 函數工作原理與結構化編程

僅當函數被調用,函數中的語句纔會被執行。執行完成後,控制權將返回到調用函數的地方。結構化編程中將任務劃分爲數個小模塊,而每個小模塊就是一個函數。

12. php變量的範圍

大部分php變量只有一個單獨的範圍,這個單獨範圍跨度同樣包含include和require引入的文件。變量的有效範圍依據聲明的位置分爲局部變量和全局變量。

局部變量

      在函數內部聲明的變量和函數的參數,都是局部變量,在函數執行結束後,函數內部變量都被釋放。

全局變量

      全局變量是在函數外部定義的,作用於爲從定義開始到本程序文件結束。php中,函數中局部變量會覆蓋同名的全局變量,此時可以在引用的全局變量前加上global關鍵字,或者使用GLOBALS數組,這個數組是運行時自動創建,用於存放全局作用域內的所有變量,通過索引就可以引用。

靜態變量

      局部變量在存儲方式上分爲動態存儲和靜態存儲。函數中的局部變量如果不是顯式的聲明爲static類型,默認爲動態分配存儲空間,在函數調用結束後自動釋放空間。這時,如果希望函數執行完成後,其內部變量依然存在內存中,應使用static將該變量修飾爲靜態變量。改變量在函數第一次被調用時初始化,之後留在內存。

13. 參數傳遞

php參數傳遞方式包括按值傳遞和引用傳遞,而且還支持默認參數和任意參數列表的傳遞方式。

值傳遞

      父程序調用函數時,函數有自己的內存區,父程序直接傳遞變量或是值給函數使用,這時候父程序的變量和傳遞進函數的變量已經不在同一個地方存放,所以函數對參數的任何操作都不會影響父程序的變量或值。例如:

複製代碼
 1 <?php 
 2 
 3   function test($arg){
 4    
 5     $arg = 100;
 6 
 7   }
 8   
 9   $var = 300;
10   echo $var;
11   test($var);
12   echo $var;
13 
14 ?>
複製代碼

      第9行$var存放在全局php所在內存中,將它的值傳遞給方法後,方法會在屬於自己的內存區劃出一塊用於存放通過參數傳遞進來的變量值。假設一個在A區,一個在B區,那麼函數操作的值在B區,並不能影響A區那個值,因爲他們不是同一個值。但是引用傳遞就不同了。

引用傳遞

      引用傳遞則是將變量在內存中的相對地址傳遞給函數,此時,函數操作的值和父程序變量是同一個值,那麼函數對傳進的參數的修改會影響父程序變量。要進行引用傳遞,只需在參數前加&,相當於c中的取址運算符。

1 function test(&$arg){
2 }

函數的默認參數

      允許定義函數時,指定參數的默認值,如:

複製代碼
 1 <?php 
 2    
 3   function test($name,$age=10){  
 4   }
 5   function show($name="bob hu",$age=10){
 6   }
 7 
 8   test("bob hu");
 9   test("bob hu",12);
10   show();
11 ?>
複製代碼

      這時,test函數參數age指定了默認值,可以不傳,但是name必傳。而show函數兩個參數都有默認值,可以直接調用,也可傳參調用。很多系統函數的前面幾個參數是必選項,後面卻是可選項,定義的方式就像test函數,如printf(),mysql_query()等。

可變長度參數列表

      即,可以傳遞多於形參個數的實參,這時可在函數內部通過func_get_args()獲得一個包括所有實參的數組,也可以通過func_num_args()獲得實參個數。該功能類似於javascript函數內部的arguments屬性。系統函數array()(難怪,數組可以不預先聲明長度,直接加入任意個數元素),echo()等參數都可變長度。

14. 變量函數

類似於javascript中將函數賦給變量,php也有這樣的功能,如:

複製代碼
1 <?php 
2    
3   function test($name,$age=10){  
4   }
5 
6   $func = "test";
7   $func("bob");
8 
9 ?>
複製代碼

(函數名也是地址?)

15. 遞歸函數

自己內部間接或直接的調用自己。

16. 使用自定義函數庫

      使用自己定義的函數,可以將這些函數放在文件中,用時,通過一些結構方法包含進來。比如:

複製代碼
 1 <?php 
 2    
 3   require("bob.php");
 4 
 5   if(true){
 6      include("hu.txt");
 7   else{
 8      include "hu.php";
 9   }
10 
11   require "bob.txt";
12 
13 ?>
複製代碼

      區別是,require在腳本執行前就會檢查並將文件加載進來,而include在執行時用到的時候才加載。另外,require_once()和include_once()保證某文件只加載一次,不重複加載。

17. 使用系統函數庫

      要使用系統的函數,就必須引入擴展包或程序庫模塊,通過phpinfo()和get_loaded_extensions()可以得知php加載了哪些擴展庫。


轉自http://www.cnblogs.com/thingk/p/3205807.html 沈金強的博客,可以看看寫的很好。對於java,c程序員學習是一個快速的過程


補充:

數組 也可以是 map 結構  $arr = array("a"=>"test","c"=>"test2");

閉包 (類似匿名函數,和js很像)

但是訪問外部變量的時候出現問題:這可能和函數的壓棧彈棧有關。

function () use ($a,$b){

}

//$a,$b是匿名函數外的變量而且是變量副本。

 java中是外部必須爲final 不能修改;

php這裏是c的值傳遞副本模式,能用不能改。屬於內存中的複製。

而 javascript 不存在棧針問題。直接就是內存指針的調用。function 中可以直接訪問外部變量,(內存結構,不太瞭解)。

發佈了52 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章