PHP 基礎知識-1

zhangsen發表於2019-03-25

面試的時候發現自己有時候連最基礎的知識都不能準確的回答,甚是可悲,萬丈高樓平地起!

1-語法規範

  1. 行位單位、所以每行要用分號結束
  2. 變數嚴格區分大小寫,函式名、方法名、類名不區分大小寫

2-標籤4種

  1. xml風格<?php ?>
  2. script風格<script language="php"> echo "script"; </script>
  3. 短格式<? echo 'php'; ?>
  4. sap格式 <% echo "php"; %>

3-註釋

  1. 雙引號

  2. 單引號

    注意:雙引號不能與單引號錯位

4-變數

1-變數的定義

變數就是記憶體中用於臨時儲存資料的一個記憶體空間,每一個空間都有一個名子,這個名子就是變數名,變數名的作用是用於引用,通過變數名對變更的操作就是對記憶體的對應的空間都讀寫。

語法:$變數名=值;

  1. 變數名必須是字元數字下劃線開頭
  2. 必須以 $ 開頭
  3. 變數名嚴格區分大小寫

2.-可變變數

A變數值是另一個變數的名,就可以在A變數名前加兩個$讀取另一個變數的值。

$a = 'b';
$b = 'c';

$$a = 'c';

3-預定義變數 (9種、$_$GLOBALS)

  1. $_GET 用於接收從前臺以get方式傳遞過來的資料
  2. $_POST 用於接收從前臺以post方式傳遞過來的資料
  3. $_REQUEST 包含get與post方式傳遞的資料
  4. $_SERVER 記錄了客戶端與伺服器端的相關資訊
  5. $_COOKIE 主要用於記錄php會話技術中的儲存在客戶端的資料
  6. $_SESSION 主要用於記錄php會話技術中的儲存在伺服器端的資料7.
  7. $GLOBALS 主要用於記錄全域性變數
  8. $_FILES 主要儲存使用者上傳的檔案的資訊
  9. $_ENV 主要用於儲存php的環境變數

6-變數的刪除

  1. unset(變數名);記憶體中沒有
  2. 變數名 = null;(變數的值是null,還存在於變數中)

7-常量

常量就是一類特殊的變數,常量也是儲存資料的,但是常量一旦定義就不允許更改值,常量本身也不能刪除。

  1. 常量的定義
    1. define('常量名',值);
    2. const 常量名 = 值;
  2. 區別:
    1. const可以定義類的內部和外部
    2. define只能定義類的內部
    3. define的第三個引數區別大小寫 true

const的值讀取:constant()

8-魔術常量(6種、__開頭)

__FILE__            當前指令碼檔案的完整路徑名
__LINE__            當前行號
__DIR__             當前檔案的所在的目錄
__FUNCTION__           獲取當前所在的函式名
__METHOD__         獲取當前所在的方法名。形式 類名::方法名
__CLASS___         獲取當前所在的類名

9-資料型別

==三大型別:(4+2+2)==

  1. 標量資料型別(int、float、string、bool)
  2. 複合資料型別 (array、object)
  3. 特殊資料型別(resource、null)

一. 標量資料型別

  1. int

  2. float

  3. string

    1. 使用單引號定義的字串能被轉義的字元有\’轉義成` \\轉義成\

    2. 單引號中的變數不能被解釋為變數的值

    3. 使用雙引號定義的字串能被轉義的字元有\” \ \$ \t \n

    4. 雙引號中的變數能被解釋為變數的值

    5. 雙引號中的變數有時需使用”{}”括起來,來限定變數

      1. php中的轉義符()
      \'        單引號
      \"        雙引號
      \t        tab表(製表符)
      \n        換行
      \r        回車
      \\        \
      \$        $
      1. 定界符 heredoc 、nowdoc

        <?php
        //heredoc
        $a = 100;
        $str =<<<abc
        sadsad,$a,sad
        abc;
        echo $str;
        
        //nowdoc
        $a =100; 
        $str = <<<'AAA'
        這裡可以是任合內容
        我是歷的苛奪基$a
        本原則葉落歸根在運
        輸費艱難田¥¥&……
        AAA;
        echo $str;
  4. Boolean

10-複合資料型別

  • 陣列
  1. ==索引陣列== 下標是整數
  2. ==關聯陣列== 下標是字元
  • object
    物件

11-特殊資料型別

  1. resource
  2. null

12-資料型別的轉換

  1. 其他資料型別轉為整型
    在這裡插入圖片描述

  2. 其他資料型別轉為字串

在這裡插入圖片描述

  1. 其他資料型別轉為布林型

在這裡插入圖片描述

  • 所有0、“”、“0”、null、array()轉布林都為false

13-變數與常量的記憶體理解

1、記憶體分割槽

  1. 棧區 cpu
  2. 堆區 儲存複合型別的值
  3. 資料段 簡單的值,細分全域性區(全域性變數、區域性變數)和靜態區(常量、類常量、靜態變數)
  4. 程式碼區 (存程式碼)

14-執行過程

  1. 編譯
  2. 執行
  3. 輸出

15-函式判斷

is_int()            判斷是否為整型
is_bool()       判斷是否為布林型別
is_array()      判斷是否為陣列
is_null();      判斷是否為null
is_object()     判斷是否為物件
is_string()     判斷是否為字串
is_scalar();        判斷是否為標量資料型別
  1. empty();
  • 判斷一個變數是否為“空”,只要是能夠轉換為布林false都是所謂的“空”,返回布林true。0、0.0、””、’0’、false、null、空陣列
  1. isset();
  • null的時候是false
  • 主要用於判斷是否設定值,如果是null值才返回false
  1. is_null();
  • 只有是null才為true
  • 主要用於判斷一個變數的值是否為null

16-PHP的輸出語句

echo

print

print_r()

var_dump()

sprint_f()

十四、運算子

值得注意的是,很多人搞不清楚前自增和後自增的區別,

前自增

​ 執行規則:先對變數的值進行加1,再使用變數的值進行運算

後自增

​ 執行規則:先使用變數的值進行運算,再對變數的值進行加1

提示:

​ 無論前自增還是後自增,變數的值都會加1,唯獨受影響的是整個式的結果

  1. 算術運算子
    1. 前自增
    2. 後自增
    3. 前自減
    4. 後自減
  2. 字串運算子
    1. .
    2. .=
  3. 比較運算子
  • >、<、>=、<=、!=、==、===、!==
  • 提示:
  • 布林false
  • 等效false的值(0、0.0、””、’0’、null、空陣列)
  • 如果要嚴格區分等效於false的其他資料型別值與真的布林值false,那麼請求===
  1. 邏輯運算子
  • &&、||、!、and、or
  • 邏輯與短路:有一個為true返回true
  • 邏輯或短路:有一個為false返回false
and、or 與  &&、||區別:
and、or的運算優先順序低於=
&&、||的運算優先順序高於=
  1. 位運算子

十五、流程控制

一、 分支結構

//單分支
if(exp){
        //your code
}

//雙分支
if(exp){
        //your code
}else{
        //default code
}

//多分支
if(expA){
        //codeA
}else if(expB){
    //codeB
}else if(expC){
    //codeC
}else{
    //default code
}
switch分支
語法:
switch(變數){
    case 值1:
        //語句體1
        break;
    case 值2:
        //語句體2
        break;
    default:
        //預設語句體
}

php中switch的比較屬於==比較,js中switch的比較屬於===

二、 迴圈控制

  1. for迴圈
for($i=0;$i<10;$i++){
}
  1. foreach迴圈
語法1:
    foreach(陣列 as $v){
        //迴圈體
}

語法2:
    foreach(陣列 as $k=>$v){
        //迴圈體
}
  1. while迴圈
while(exp){
        //迴圈體
}
  1. do…while迴圈
do{
        //迴圈體
}while(exp)

一、陣列 count($arr)

  1. 元素
  2. 下標
  3. 個數

二、陣列的相關操作

  1. 定義:array()、[]
  2. 追加
  3. 刪除 usnet();

三、陣列的遍歷

  1. 下標連續的
for($i = 0 ;$i<count($arr);$i++){

}
  1. 下標不連續
foreach(陣列 as $k => $v){
    //迴圈體
}

三、陣列的分類

  1. 索引陣列-下標是整數
  2. 關聯陣列-下標是字串
  3. 混合陣列

四、關聯陣列的遍歷
==怎麼把關聯二維陣列轉換成一維陣列==

 public function test1(){
        $user = array(
            'id'=>1,
            'name'=>'zhangsan',
            'age'=>19
        );

        $arr = '';
        foreach ($user as  $key=>$value ){
            $arr .= $value;
        }
        dump($arr);die;
    }

    public function test2(){
        $arr = [];
        $arr[] = 'zhsangsan';
        $arr[] = '19';
        $arr[] = '1';
        dump($arr);die;
    }

五、函式

  1. 函式的定義
function funName(形參列表){
        //函式體
        【return 值】;
}
  1. 形參
  • 形參主要用於接收從函式外部傳遞進來的資料
  • 形參只對內部可見
  • 形參可以具有預設值,如果在呼叫時沒有為具有預設值的形參傳遞資料,那麼在函式內部使用的形參的預設值,否則使用傳遞進來的資料。
  • 具有預設值的形參一般位於形參列表的最後。
  • 形參的作用是讓函式更性有通用性
  1. 實參
  • 用於向函式內部傳遞值
  1. 匿名函式
$showInfo =function(){

}

六、靜態變數

  1. ==在函式內部使用static定義的變數就是靜態變數==
  2. 靜態變數的特性
  • 靜態變數只會被初始化一次
  • 靜態變數的值不會隨著函式的呼叫而銷燬,仍然在記憶體,但是不能在函式外部訪問。
  • 靜態變數在其後函式呼叫時還可以訪問,並且保留上一次函式執行時的結果
  • ==專案中積分的使用問題==

七、傳值方式

  1. 賦值傳真
    • 將變數A的值傳遞到變數B
  2. 引用傳值
    • 將變數A的記憶體地址傳遞到變數B
  3. &地址符
    • 用於將賦值傳值更改為引用傳值。
  4. 函式的實參地址的傳遞
    • 函式的實參與形參的傳值是賦值傳值
    • 如果想實現函式實參與形參的引用傳值,形參前面加&

八、作用域

  1. 外部作用域

    在任何函式外部定義的變數就是全域性變數,其作用域就是全域性作用域

  2. 內部作用域

    在函式內部定義的變數就是區域性變數,其作用域就是區域性作用域

  3. 全域性作用域

    global關鍵字
    函式內部訪問函式外部的變數

  4. 不受作用域限制

    1. 常量、
    2. 預定義的變數:
    3. $_GET
    4. $_POST
    5. $_REQUEST
    6. $_SERVER
    7. $_SESSION
    8. $_COOKIE
    9. $_ENV
    10. $_FILES
    11. $GLOBALS

一、PHP檔案引入

  1. require
  • 在引入的檔案發生錯誤(不存在),會直接結束當前迴圈的執行。
  1. inlcude
  • 在引入的檔案發生錯誤(不存在),會繼續其後的程式碼執行。
  1. require_once\include_once
  • 在引入檔案時會先檢查被引入的檔案之前是否有引入過,如果沒有則引入,有就不引入
    說明:一般引入的程式碼有邏輯性的,使用require,include一般用來引入HTML

二、針對呼叫的函式引入問題

  1. 同一個指令碼內可以先呼叫函式後定義函式
  • 原理:先編譯,編譯後程式碼區就有了函式的定義程式碼,後再呼叫,正常
  1. 先呼叫,後引入,報錯(原因是引入的檔案是先引入後呼叫,執行呼叫時檔案還沒有定義,所以會報錯)

三、PHP常用字串

  1. ==strlen== 字串的長度

    $string = 'http://www.doc.com/index.php/Home/Test/strlen';  
    echo (strlen($string));
  2. ==strchr== 查詢search字串首次出現的位置並擷取到最後

    strchr($string,'w')
  3. ==strrchr== 查詢search字串末次出現的位置並擷取到最後

    strchr($string,'i')
  4. ==strpos== 在str字串中查詢search字串首次出現的位置(0開始算起)

    echo (strpos($string,'w'));
  5. ==strrpos== 在str字串中查詢search字串最後一次出現的位置

    echo (strpos($string,'w'));
  • stripos、strripos i表示不區分大小寫的查詢
  1. ==trim==
    ①:trim(str【,substr】) 用於在str字串兩端去除指定的substr字元,如果省略substr,則是去除空格

    $string = "  zhangsan   ";
    echo(trim($string));
    
    $string1 = '22zhangsan22';
    echo '<br/>';
    echo (trim($string1,'22'));

    ②:ltrim(str【,substr】) 去除左側指定的字元或空格

    $string2 = '22zhangsan';
    echo (ltrim($string2,22));

    ③:rtrim(str【,substr】) 去除右側指定的字元或空格

    $string2 = 'zhangsan22';
    echo (rtrim($string2,22));
  2. ==str_repeat(str,n)==

    $string2 = 'nice';
    echo (str_repeat($string2,3));
  3. ==ucfirst、ucwords== 首寫單詞大寫,一句話首單詞大寫

    $string2 = 'nice';
    echo (ucfirst($string2));
    
    $string2 = 'nice aweqwe dqwe';
    echo (ucwords($string2));
  4. ==strtolower、strtoupper== 轉換大小寫

  5. ==explode(sep,str)== 將字串str,使用sep分隔符進行分割,並以陣列的形式返回

    $str = "people became quite illogical when they decide";
    var_dump(explode(' ',$str));
  6. ==md5( )== 加密,返回32位字串

  7. ==addslashes()==
  • 對於些特殊字元新增反斜槓(\),特殊字元(‘)(“)(\)
  1. ==stripslashes( )==
  • addslashes的逆運算,去除反斜槓
  1. ==htmlspecialchars== 將html語言中的標籤轉換成對應的字元實體。
  2. ==htmlspecialchars_decode== 逆運算
  3. ==chr、ord==
  • ord主要用於獲取字元的unicode編碼 97
  • chr主要用於獲取指定編碼對應的字元 b

四、數學函式

  1. max() 獲取多個變數或陣列中的最大值
  2. min() 獲取多個變數或陣列中的最小值
  3. abs() 獲取絕對值
  4. ceil() 向上取整
  5. floor() 向下取整
  6. rand(m,n) 獲取m與n之間的隨機整數
  7. mt_rand(m,n); 推薦,獲取m與n之間的隨機整數
  8. round(v【,p】); 對變數v保留p位小數(四捨五入),如果省略p表示直接取整
  9. pow(m,n); 取m的n次方
  10. sqrt(v); 開平方

五、陣列函式

  1. count() 陣列長度

  2. array_keys($arr); 以陣列形式返回key值

  3. array_values($arr); 以陣列形式返回value值

  4. in_array($value); 判斷陣列$arr中存是否有$value值存在

  5. array_key_exists($key,$arr); 判斷陣列$arr中存是否有$key鍵名存在

  6. 陣列新增與刪除

    • array_pop(); 從尾部刪除一個元素
    • array_push(); 向陣列的尾部追加一個元素
    • array_shift(); 從頭部刪除一個元素
    • array_unshift(); 向陣列的部部追加一個元素
    • array_splice(); 從陣列的中間刪除指定個數的元素,並以新的元素代替
  7. list結構

    list(變數列表)= 陣列

    將陣列中的元素的值,依次賦值給list後的變數,要求陣列是一個索引陣列

  8. 陣列排序

    • sort(arr); 對陣列進行升序排序
    • rsort($arr); 對陣列進行降序排序
  9. 陣列合並

    • array_merge(arrA, arrA, arrA,….);
  10. 陣列指標相關的函式
  • each(); 用於獲取當前陣列指標所指向的元素,並返回一個混合陣列,==並將指標下移==。

  • key(); 用於獲取當前陣列指標所指向元素鍵名

  • current(); 用於獲取當前陣列指標所指向元素的鍵值

  • next(); 將指標下移

  • prev(); 將指標上移
  • end(); 將指標指向最後一個元素
  • reset(); 重置指標(回到第一個元素)
<?php
$arr =[
    'id'=>2,
    'brand' => 'apple',
    'price'=> 16
];
//用於獲取當前陣列指標所指向的元素,並返回一個混合陣列,並將指標下移。
var_dump(each($arr));

var_dump(key($arr)) ;
var_dump(current($arr)) ;
var_dump(next($arr)) ;
var_dump(prev($arr)) ;
var_dump(end($arr)) ;
var_dump(reset($arr)) ;

輸出結果

array(4) {
  [1]=>
  int(2)
  ["value"]=>
  int(2)
  [0]=>
  string(2) "id"
  ["key"]=>
  string(2) "id"
}
string(5) "brand"
string(5) "apple"
int(16)
string(5) "apple"
int(16)
int(2)

示例2:使用each遍歷陣列

<?php
$arr =[
    'id'=>2,
    'brand' => 'apple',
    'price'=> 16
];

while($data = each($arr)){
    echo $data['value'],'<br/>';
}