1. 程式人生 > >燕十八PHP基礎

燕十八PHP基礎

變數

變數檢測

  1. bool isset ( mixed $var [, mixed $… ] )— 檢測變數是否設定
    注意:一次可以檢測多個變數,有一個變數未設定,則返回false; 如果 var 存在並且值不是 NULL 則返回 TRUE,否則返回 FALSE。

變數型別判斷

  1. string gettype ( mixed $var ) — 獲取變數的型別
    返回值:
    “boolean”
    “integer”
    “double”(由於歷史原因,如果是 float 則返回“double”,而不是“float”)
    “string”
    “array”
    “object”
    “resource”
    判斷是否是指定型別的變數:is_array,is_bool,is_float(is_double),is_int(is_integer),is_null,is_string,is_object,is_resource

變數型別轉換

最常見的是字串與數字的轉換,或是數字/字串->布林值的轉換。

$a='12avaf1422';
$b=1;
echo $a+$b;//13

資料型別轉換

$num1=3.14;
$num2=(int)$num1;
var_dump($num1);
echo "<br/>";
var_dump($num2);//int(3)
  1. empty() — 檢查一個變數是否為空 當var存在,並且是一個非空非零的值時返回 FALSE 否則返回 TRUE.
    以下的東西被認為是空的:
    “” (空字串)
    0 (作為整數的0)
    0.0 (作為浮點數的0)
    “0” (作為字串的0)
    NULL(null值)
    FALSE(布林值false)
    array() (一個空陣列)
    $var; (一個聲明瞭,但是沒有值的變數)

傳值賦值與引用賦值

$num1=1;
$num2=2;
echo $num2;//2
$num2=&$num1;
echo $num2;//1

引用賦值結合變數銷燬unset():

$num1=0;
$num2=&$num1;
unset($num1);
var_dump($num2,$num1);//int(0) NULL

注意:$num1銷燬變數後,$num2值依然存在

動態變數名

$mk='孟珂';
$$mk='裴丹聖';
echo $mk,'love',$$mk;

運算子

算數運算子

整型太大的話,會自動轉換成浮點型:

var_dump(100000000000000000000000);//float(1.0E+23)

取模運算時,結果的正負僅僅取決於被除數的正負:

$a=-10;//換成10試試
$b=3;//換成-3試試
echo $a%$b;

比較運算子

比較運算子

三元運算子

(expr1) ? (expr2) : (expr3)
對 expr1 求值為 TRUE 時的值為 expr2,在 expr1 求值為 FALSE 時的值為 expr3。

$test=1;
$re=$test??'不存在';//PHP7+寫法
$re=$test?:'不存在';// PHP 5.3+普通寫法
echo $re,PHP_EOL;
echo 'hi';

邏輯運算子

x xor y 異或 如果 x 和 y 有且僅有一個為 true,則返回 true

echo( (10 xor 1) ?:'假');//假
  1. 關於“短路”
// foo() 根本沒機會被呼叫,被運算子“短路”了

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());
  1. 關於運算子優先順序
    運算子優先順序
    “||” 比 “or” 的優先順序高
    “&&” 比 “and” 的優先順序高
    =比 and or 的優先順序高
$e = false || true;
$f = false or true;
var_dump($e, $f);//true false 
$g = true && false;
$h = true and false;
var_dump($g, $h);//false  true

遞增遞減運算子

遞增遞減運算子
遞增或遞減對布林值無效!

字串運算子

.就一個點,我只說一次!

賦值運算子

賦值運算子

控制結構

Switch case

注意:必須要使用 break 來阻止程式碼跳入下一個 case 中繼續執行!

do while

do
{
要執行的程式碼;
}
while (條件);

for

for (初始值; 條件; 增量)
{
 要執行的程式碼;
}

注意:
上面的初始值和增量引數可為空,或者有多個表示式(用逗號分隔)。
條件:迴圈執行的限制條件。如果為 TRUE,則迴圈繼續。如果為 FALSE,則迴圈結束。

break 和continue 區別

break 在迴圈中作用是結束一個迴圈
continue立即結束本次迴圈,繼續執行下一次迴圈

函式

PHP 的真正威力源自於它的函式!
函式是一段封裝好的程式碼,隨時可呼叫。

定義格式

命名規則和變數命名一樣,但是函式不區分大小寫;
函式的名稱應該提示出它的功能。

函式執行與返回流程

當函式所有語句執行完畢或者碰到return語句時,函式結束,交回執行權。

函式傳參方式

函式內部變數與外界變數無關:

function t($a)
{
    $a += 1;
    return $a;
}

$a = 1;
t($a);
echo $a;//輸出1

引用傳參(不推薦,因為函式內部的語句影響到了外部的變數,破壞了函式的封裝性):

function t(&$a)
{
    $a += 2;
    return $a;
}

$b = 1;
t($b);
echo $b;//輸出3

函式作用域

global 關鍵字用於函式內訪問全域性變數。

$x=5;
$y=10;

function myTest()
{
global $x,$y;
$y=$x+$y;
}

myTest();
echo $y; //在PHP5版本下輸出值是15;在PHP7版本下輸出值是10

在PHP7版本中,函式內只能訪問全域性變數,無法對全域性變數的值進行改變!
PHP將所有全域性變數儲存在一個名為$GLOBALS[index]的陣列中。index為 儲存變數的名稱。上面的例項可以寫成這樣:

$x=5;
$y=10;

function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 

myTest();
echo $y;

動態呼叫函式

function wel()
{
    echo 'welcome';
}

function bad()
{
    echo 'bad';
}

$heart = 'wel';
$heart();

時間戳函式

time();
返回當前時間戳
microtime(get_as_float) 函式返回當前 Unix 時間戳的微秒數。
如果 get_as_float 引數設定為 TRUE,則返回浮點數,表示自 Unix 紀元(January 1 1970 00:00:00 格林威治時間(GMT))起精確到微秒的以秒為單位的當前時間.

echo microtime();//0.68480900 1539325171
echo '<hr>';
echo microtime(true);//1539325171.6848

可在程式開頭和結尾分別放一個,兩者相減,用於計算程式執行時間。

時間戳格式化

echo date('Y-m-d,星期l,a h:i:s');//2018-10-12,星期Friday,AM 06:43:21
echo gmdate('Y-m-d,星期l,a h:i:s');//2018-10-12,星期Friday,AM 06:43:21

date(format,timestamp)
gmdate(format,timestamp)
timestamp 可選。規定時間戳。。預設是當前時間和日期
兩個函式日期都是自GMT起。
PHP 5.1.0:有效範圍的時間戳是從 1901 年 12 月 13 日 20:45:54 GMT 星期五 到 2038 年 1 月 19 日 03:14:07 GMT 星期二。5.1.0 之前的版本,在某些系統上(例如 Windows)時間戳被限制在從 01-01-1970 到 19-01-2038。

日期解析函式

mktime(hour,minute,second,month,day,year)
函式返回日期的 Unix 時間戳。Unix 時間戳包含 Unix 紀元(1970 年 1 月 1 日 00:00:00 GMT)與指定時間之間的秒數。
strtotime() 函式用於把人類可讀的字串轉換為 Unix 時間。

strtotime(' today+1day')

checkdate(month,day,year);如果日期是有效的則返回 TRUE,否則返回 FALSE。

Math函式

  • abs(x)
    返回一個數的絕對值。
  • ceil(x)
    向上舍入為最接近的整數。
    返回的型別仍然是 float,因為 float 值的範圍通常比 integer 要大。
  • floor(): 去尾法取整
  • fmod(): 浮點數取餘
  • pow(): 返回數的n次方
  • round(): 浮點數四捨五入
  • max(): 求最大值
    註釋:如果僅有一個引數且為陣列,max() 返回該陣列中最大的值。如果第一個引數是整數、字串或浮點數,則至少需要兩個引數而 max() 會返回這些值中最大的一個。可以比較無限多個值。
echo max(1, 3, 5, 6, 7);//7
echo max(array(2, 4, 5));//5
  • trim(string,charlist)
    移除字串兩側的空白字元或其他預定義字元。
$str = "Hello World!";
echo $str . "<br>";//Hello World!
echo trim($str,"Hled!");//o Wor
  • ltrim() - 移除字串左側的空白字元或其他預定義字元
  • rtrim() - 移除字串右側的空白字元或其他預定義字元

Filesystem函式

  • dirname(path)返回路徑中的目錄部分

字串

字串定義方式

單引號,雙引號,
heredoc,nowdoc

//heredoc
$a='孟珂';
$str1=<<<INTRO
hello world
        {$a}you ok?
INTRO;
echo $str1;

echo $str1;//hello world 孟珂you ok?


//nowdoc
$a='孟珂';
$str1=<<<'INTRO'
hello world
        {$a}you ok?
INTRO;
echo $str1;//hello world {$a}you ok?

  • 相同點:用於定義大段文字;
    1.識別符號可以自定義 一般的 有EOT ,EOD EOF 等, 只有保持開始表示符和結束表示符一樣即可。
    2.結束表示符必須獨佔一行,且必須頂格寫,不能有空格,最後以 ‘;’ 分號結尾。
    3.所有引用的字串中可以包含變數,無需字串連線符。
  • 不同點:(同單引號和雙引號的不同點)
    轉義
    變數解析
    速度:單引號不需要分析串內有沒有變數,需要轉義的內容也少,速度更快。

字串常用函式

strlen(string) 函式返回字串的長度。
utf-8編碼,一箇中文佔3個位元組
mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
獲取一個 string 的長度。
encoding 引數為字元編碼。如果省略,則使用內部字元編碼。

echo mb_strlen('孟珂','utf-8');//2

strpos(string,find,start)
函式查詢字串在另一字串中第一次出現的位置。

  • 對大小寫敏感。
  • 如果沒有找到字串則返回 FALSE。
  • 註釋: 字串位置從 0 開始,不是從 1 開始。
  1. stripos() - 查詢字串在另一字串中第一次出現的位置(不區分大小寫)
  2. strripos() - 查詢字串在另一字串中最後一次出現的位置(不區分大小寫)
  3. strrpos() - 查詢字串在另一字串中最後一次出現的位置(區分大小寫)

str_replace(find,replace,string,count)str_replace(find,replace,string,count)
以其他字元替換字串中的一些字元(區分大小寫)。
str_ireplace() 函式執行不區分大小寫的搜尋。

echo str_replace('fuck','**','fuckyoufuck');//**you**
  • 如果搜尋的字串是陣列,那麼它將返回陣列。
  • 如果搜尋的字串是陣列,那麼它將對陣列中的每個元素進行查詢和替換。
  • 如果查詢的是陣列,而替換的是字串,那麼替代字串將對所有查詢到的值起作用。
print_r(str_replace('fuck','***',array('fuck you','fuckyoufuck')));//Array ( [0] => *** you [1] => ***you*** ) 
  • 如果同時需要對陣列進行查詢和替換,並且需要執行替換的元素少於查詢到的元素的數量,那麼多餘元素將用空字串進行替換
$find = array("Hello","world");
$replace = array("B");
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr));//Array ( [0] => B [1] => [2] => ! )

查詢元素和替換元素都為陣列時,它倆裡邊的值一一對應。

$find = array("Hello","world");
$replace = array("B",'c');
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr));//Array ( [0] => B [1] => c [2] => ! )

strtr(string,from,to)或strtr(string,array) 批量替換字串

echo strtr('hello world',['hello'=>'hi','world'=>'earth']);//hi earth

substr(string,start[,length])
函式返回字串的一部分。
註釋:如果 start 引數是負數且 length 小於或等於 start,則 length 為 0。
length可選。規定被返回字串的長度。預設是直到字串的結尾
explode(separator,string,limit)
把字串打散為陣列。
implode(separator,array)
返回由陣列元素組合成的字串
separator 可選。規定陣列元素之間放置的內容。預設是 “”(空字串)

  • str_pad(string,length,pad_string,pad_type)
    把字串填充為新的長度。
$str = "Hello World";
echo str_pad($str,30,".");//Hello World...................

註釋:length 必需。規定新的字串長度。如果該值小於字串的原始長度,則不進行任何操作。

  • str_repeat(string,repeat)
    返回值: 返回被重複的字串。
  • str_split(string,length)
    把字串分割到陣列中。
    返回值: 返回分割後的陣列。
    如果 length 小於 1,則 str_split() 函式將返回 FALSE。
    如果 length 大於字串的長度,則整個字串將作為陣列的唯一元素返回。
    註釋:length 可選。規定每個陣列元素的長度。預設是 1。

陣列

宣告方式

  1. array()來宣告;
  2. 是一種複合資料,可以裝下多個值,每個值用不同的鍵來區分。

陣列型別

  1. 索引陣列:鍵五特殊意義,為純數字
  2. 關聯陣列 :字串做鍵,一般能體現該單元的內容
  3. 多維陣列

陣列鍵規則

  1. 如果不宣告鍵,則從0,1,2遞增來生成鍵

  2. 如果已經存在某1個或幾個數字鍵,則從最大的數字鍵,遞增生成數字鍵

$arr=array(3=>'a','b');
print_r($arr);//Array ( [3] => a [4] => b )
  1. 如果鍵宣告重複了,後面的值覆蓋前面的值
$arr=array(3=>'a',3=>'b','c');
print_r($arr);//Array ( [3] => b [4] => c )

運算元組單元

  • 增加單元
    $arr[]=$value;
    或者:
    $arr[$key]=$value;
  • 讀取單元值
    $arr[$key]
  • 修改單元值
    $arr[$key]=$value
  • 刪除單元值
    unset[$arr[$key]]

遍歷陣列

foreach($arr as $value){}
或者
foreach($arr as $key=>$value){}

遊標操作

  • current() 函式返回陣列中的當前元素的值。
  • end() - 將內部指標指向陣列中的最後一個元素,並輸出
  • next() - 將內部指標指向陣列中的下一個元素,並輸出
  • prev() - 將內部指標指向陣列中的上一個元素,並輸出
  • reset() -將內部指標指向陣列中的第一個元素,並輸出
  • each() - 返回當前元素的鍵名和鍵值,並將內部指標向前移動
    each() 函式在 PHP 7.2.0 中被棄用了。

陣列常用函式

  • array_push(array,value1,value2…)
    函式向第一個引數的陣列尾部新增一個或多個元素(入棧),
    返回值: 返回新陣列的長度。
  • 註釋:即使陣列中有字串鍵名,您新增的元素也始終是數字鍵
  • 註釋:如果用 array_push() 來給陣列增加一個單元,還不如用 $array[] =,因為這樣沒有呼叫函式的額外負擔
  • 註釋:如果第一個引數不是陣列,array_push() 將發出一條警告。這和$var[] 的行為不同,後者會新建一個數組。
  • array_pop(array)
    函式刪除陣列中的最後一個元素。
    返回值: 返回陣列的最後一個值。如果陣列是空的,或者非陣列,將返回 NULL。
  • array_unshift(array,value1,value2,value3…)
    用於向陣列插入新元素。新陣列的值將被插入到陣列的開頭。
    返回值: 返回陣列中新的元素數目。
  • array_shift(array)
    刪除陣列中第一個元素
    返回值: 返回被刪除元素的值,如果陣列為空則返回 NULL
  • array_key_exists(key,array)
    檢查某個陣列中是否存在指定的鍵名
    返回值: 如果鍵名存在則返回 true,如果鍵名不存在則返回 false。
  • in_array(search,array,type)
    搜尋陣列中是否存在指定的值。
    返回值:如果給定的值 search 存在於陣列 array 中則返回 true。如果第三個引數設定為 true,函式只有在元素存在於陣列中且資料型別與給定值相同時才返回 true。
    如果沒有在陣列中找到引數,函式返回 false。
    註釋:如果 search 引數是字串,且 type 引數設定為 true,則搜尋區分大小寫。
  • array_merge(array1,array2,array3…)
    把一個或多個數組合併為一個數組。
    返回值: 返回合併的陣列。
    註釋:如果兩個或更多個數組元素有相同的鍵名,則最後的元素會覆蓋其他元素。
    註釋:如果您僅向 array_merge() 函式輸入一個數組,且鍵名是整數,則該函式將返回帶有整數鍵名的新陣列,其鍵名以 0 開始進行重新索引。
$a=array(3=>"red",4=>"green");
print_r(array_merge($a));
//Array ( [0] => red [1] => green )
  • array_merge_recursive(array1,array2,array3…)
    把一個或多個數組合併為一個數組。
    返回值: 返回合併的陣列。
    註釋: 該函式與 array_merge() 函式的區別在於處理兩個或更多個數組元素有相同的鍵名時。array_merge_recursive() 不會進行鍵名覆蓋,而是將多個相同鍵名的值遞迴組成一個數組。
    註釋: 如果您僅僅向 array_merge_recursive() 函式輸入一個數組,結果與 array_merge() 相同,函式將返回帶有整數鍵名的新陣列,其鍵名以 0 開始進行重新索引。
$a1=array("a"=>"red","b"=>"green");
$a2=array("c"=>"blue","b"=>"yellow");
print_r(array_merge_recursive($a1,$a2));
//Array
(
    [a] => red
    [b] => Array
        (
            [0] => green
            [1] => yellow
        )

    [c] => blue
)

  • sort(array,sortingtype);
    對索引陣列按鍵值進行升序排序。
    返回值:如果成功則返回 TRUE,否則返回 FALSE。
    註釋:本函式為陣列中的單元賦予新的鍵名。原有的鍵名將被刪除。
$cars=array('v'=>"Volvo",'b'=>"BMW",'t'=>"Toyota");
sort($cars);
var_dump($cars);
//array(3) {
  [0]=>
  string(3) "BMW"
  [1]=>
  string(6) "Toyota"
  [2]=>
  string(5) "Volvo"
}
  • rsort(array,sortingtype);
    對數值(即索引)陣列按鍵值進行降序排序。
    返回值:如果成功則返回 TRUE,否則返回 FALSE。
  • usort(array,myfunction);
    通過使用者自定義的比較函式對陣列進行排序。
    返回值: 若成功則返回 TRUE,若失敗則返回 FALSE。
function my_sort($a,$b)
{
    if ($a==$b) return 0;
    return ($a<$b)?-1:1;
}

$a=array(4,2,8,6);
usort($a,"my_sort");
print_r($a);//Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
  • asort(array,sortingtype);
    對關聯陣列按照鍵值進行升序排序。
    返回值: 如果成功則返回 TRUE,如果失敗則返回 FALSE。

  • arsort()
    函式對關聯陣列按照鍵值進行降序排序。

  • ksort()
    函式對關聯陣列按照鍵名進行升序排序。

  • krsort(array,sortingtype);
    對關聯陣列按照鍵名進行降序排序。

  • array_diff(array1,array2,array3…);
    返回兩個陣列的差集陣列。
    返回值: 返回差集陣列,該陣列包括了所有在被比較的陣列(array1)中,但是不在任何其他引數陣列(array2 或 array3 等等)中的鍵值

  • array_diff_assoc(array1,array2,array3…);
    用於比較兩個(或更多個)陣列的鍵名和鍵值 ,並返回差集。
    返回值: 返回陣列,該陣列包含所有在 array1 中,但是不在任何其他引數陣列(array2 或 array3 等等)中的鍵名和鍵值。
    註釋: 與array_diff()區別在於array_diff()是比較陣列的值,而array_diff_assoc()的比較包括鍵和值。

$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");

$result=array_diff_assoc($a1,$a2);
print_r($result);
//Array
(
    [a] => red
    [b] => green
    [c] => blue
    [d] => yellow
)

  • array_intersect(array1,array2,array3…);
    返回兩個或多個數組的交集陣列。
    返回值: 返回交集陣列,該陣列包括了所有在被比較的陣列(array1)中,同時也在任何其他引數陣列(array2 或 array3 等等)中的鍵值。

  • array_intersect_assoc(array1,array2,array3…)
    用於比較兩個(或更多個)陣列的鍵名和鍵值,並返回交集。
    返回值: 返回交集陣列,該陣列包括了所有在被比較的陣列(array1)中,同時也在任何其他引數陣列(array2 或 array3 等等)中的鍵名和鍵值。

  • array_change_key_case(array,case);
    將陣列的所有的鍵都轉換為大寫字母或小寫字母。(預設將陣列的鍵轉換為小寫字母。)
    返回值: 返回鍵為大寫或小寫的陣列,或者如果 array 非陣列則返回 FALSE。
    註釋:如果在執行該函式時