php語法基礎(相比C語言)


前言

php的語法跟C語言很類似,相信有一定C的基礎的人學起來會非常快。

本篇主要介紹php相比C語言有差異的地方

php代碼標記

ASP標記:<% 代碼 %>

短標記:<? 代碼 ?> 前兩種基本棄用

腳本標記:<script language="php"> 代碼 </script>

標准標記:<?php 代碼 ?> <常用>

很多php代碼不是嵌入到html中的,?>建議不使用,會自動認為后面都是php代碼。不用傳遞多余的空格

 

變量

刪除變量

unset($var); //用於釋放內存

預定義變量:都是數組

$_GET: 獲取所有表單以get方式提交的數據

$_POST: 獲取所有表單以post方式提交的數據

$_REQUEST: GET和POST提交都會保存

$GLOBALS: PHP中所有全局變量

$_SERVER: 服務器信息

$_SESSION: session會話數據

$_COOKIE: cookie會話數據

$_ENV: 環境變量

$_FILES: 用戶上傳的文件信息

可變變量

變量保存的值正好是另外一個變量的名字,可以通過訪問一個變量得到另一個變量的值,類似指針的功能。

變量前面兩個$$

$a='b';

$b='bb';

$$a-->'bb'

變量存儲

代碼裝載:從腳本中讀取代碼,編譯,編譯的結果放到代碼段

代碼執行:從代碼段中一行行執行

在棧區開辟內存儲存變量$a,數據段中開辟一塊內存保存值,將數據所在的位置賦值給變量

引用傳值 : $b=&$a

常量:通常大寫,不需要$

兩種定義方法:

  define('PI', 3.14);

  const PI = 3;

用define定義可以使用一些特殊字符,“-_-”

兩種定義方法,訪問權限有區別

define第3個參數,可以控制大小寫不敏感

訪問echo constant(''-_-'');

系統常量

PHP_VERSION

PHP_INT_SIZE

PHP_INT_MAX

 

魔術變量

__DIR__
__FILE__
__LINE__
__NAMESPACE__
__CLASS__
__METHOD__

數據類型

PHP是弱類型語言,變量本身沒有數據類型

3個大類8個小類

  • 簡單數據類型:

整型:int/integer,4個字節,
浮點型:float/double,8字節,表示小數或者整型存不下的整數
字符串類型:string,系統根據實際長度分配
布爾類型:bool/boolean,

  • 復合數據類型

對象類型:object
數組類型:array
特殊數據類型

  • 資源類型:resource,存放資源數據(PHP外部數據,如數據庫,文件)

空類型:NULL

類型轉換

轉布爾

除了本身為0,變量未定義或者為空,其他都為TRUE

轉數值

字符串轉數值:
以字母開頭的永遠為0,
以數字開頭的,取到碰到字母為止(不會同時兩個小數點)

強制轉換

括號里加類型,轉NULL用unset()

類型判斷

is_XXX, boolean類型不能echo,用var_dump(is_int($a));

gettype(變量名)

settype(變量名,類型)

強制類型轉換,對數據值復制的內容進行處理(不會處理實際存儲的內容)

settype會直接改變數據本身

進制轉換

0b開頭2進制,0開頭8進制,0x開頭16進制

decbin, decoct, dechex, bindec, binoct, binhex

判斷

empty(): 0, false, 空, null, 未定義

is_null: null,未定義

isset(): 跟is_null相反

== 值相同即可

=== 類型和值都要相等

其他語法

字符串連接:. .=

錯誤抑制符:在可能出錯的表達式前加@,通常在生產環境會用到

php嵌套在html中使用時,替代語法

<table border=1>
    <?php for($i = 1; $i<10; $i++){ ?>
        <tr>
            <?php for($j=1;$j<10;$j++) {?>
                <td>
                    <?php echo $i . '*' . $j . '=' . $i * $j; ?>
                </td>
            <?php }?>
        </tr>
    <?php }?>
</table>

php書寫到html中非常不美觀,php提供了一種替代機制,可以不用大括號

<?php for(;;): ?>
<?php endfor; ?>
條件和循環操作都有替代語法
左大括號用:替代
右大括號用end+對應操作;替代

系統常用函數

輸出

print(): 本質是一種結構,不是函數,返回1,可以不需要括號
print_r(): 比var_dump簡單,只會輸出值(一般用於打印數組)。

時間

date(): 按照指定的格式輸出時間,默認當前時間(1970開始的秒數)
time(): 獲取當前時間對應的時間戳
mircotime(): 獲取微秒級別的時間,+時間戳
strtotime(): 指定格式的時間字符串轉成時間戳

數學

max(), min(), rand(), mt_rand()效率更高, round(), cell(), floor(), pow(), abs(), sqrt()

有關函數的函數

function_exsits();//函數是否在內存中存在
func_get_arg(); //獲取指定的參數
func_get_args(); //獲取所有的參數,數組
func_num_args(); //獲取參數的個數

文件包含

include或require直接將代碼在當前位置嵌入,被包含的文件是單獨進行編譯的。

php文件在編譯的過程出現語法錯誤,會失敗,不會執行。但是被包含的文件有錯誤時,在執行到包含include這條語句時才報錯。

include和require的區別

include_once系統只會執行一次

包含不到文件時,報錯的形式不一樣。require如果包含出錯,代碼不再執行

文件查找,相對路徑,效率較高,可能出錯

return除了從函數中返回,還可以直接從文件中返回

$res = include_once 'aa.php';

全局跟局部

全局變量:只能在全局空間使用,理論上在函數內部不能使用

局部變量:在函數內部定義的變量,只允許在當前函數內使用

超全局變量:系統定義的變量,沒有訪問限制

global關鍵字:在函數內部定義的變量的一種方式,內部和外部都能訪問

如果global定義的變量名在外部已經存在,那么內部定義的該變量直接指向外部變量的內存空間

可變函數

變量的值剛好是一個函數的名字,類似C中函數指針, 使函數可以通過參數傳遞,實現回調函數的功能。

function display()

$func = 'display';

$func();

 

匿名函數

變量保存匿名函數,本質是一個對象(closure)

closure提供一種環境,可以在一些特定的環境下去使用內部函數

函數內部有一些局部變量,在函數執行之后沒有被釋放,因為在函數內部還有對應的函數在引用。

$func = function() user($name) {} //use將外部變量保留給內部使用,類似lambda函數

function display() {
    $name = __FUNCTION__;
    $innerfunc = function() user($name) {
        echo $name;
    };
    return $innerfunc;
}

$closure = display();    //$name並沒有被釋放
$closure();    //打印display

 

錯誤處理

錯誤分類

語法錯誤,運行錯誤,邏輯錯誤

錯誤代號(系統常量)

系統錯誤:E_PARSE, E_ERROR, E_WARNING, E_NOTICE

用戶錯誤:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE

其他:E_ALL 代表所有的錯誤,在進行錯誤控制的時候用的比較多

trigger_error('xx', [error_type]); //默認notice

//讓瀏覽器按指定字符集解析

header('Content-type:text/html; charset=utf-8');

錯誤顯示配置

  • php配置文件,php.ini,全局

display_errors:是否顯示錯誤
error_reporting:顯示什么級別的錯誤

  • 在運行的php腳本中設置,優先級高於配置文件

error_reporting();//設置錯誤顯示級別
ini_set('配置項', 配置值);


實際不會將錯誤展示給用戶,不友好,不安全

自定義錯誤處理

用戶自定義錯誤處理函數,然后將該函數增加到系統錯誤處理的句柄中,然后系統會在碰到錯誤是時調用用戶定義的錯誤處理函數。

set_error_handler

 

字符串類型

多行字符串定義

//nowdoc結構,強引用,上邊界符END后面不允許有任何內容,下邊界符必須頂格,且后面除了分好不能跟任何內容

$str = <<<'END'

END;

//heredoc結構,弱引用

$str = <<<END

END;

單引號,強引用,只能識別\'

雙引號,弱引用,不能識別\'

變量加大括號便於識別,aa{$a}aa

字符串長度

strlen()

mb_strlen() //extension=php_mbstring,可以指定字符集

字符串相關函數

  • 轉換:implode, explode, str_split

implode: 將數組中元素按指定規則連接
explode: 將字符串按某種格式分隔,變成數組
str_split: 按照指定長度拆分字符串,得到數組

  • 截取:trim, ltrim, rtrim

trim: 默認去除兩邊的空格,也可以指定其他要去除的字符,碰到一個不是的就停止

  • 子串: substr, strstr, stristr

substr: 返回指定位置開始指定長度的子串
strstr: 返回匹配字符串首次出現的位置到結尾的子串

  • 大小寫: strtolower, strtolower, ucfirst

ucfirst: 首字母大寫

  • 查找: strpos, strrpos

strpos: 查找子串首次出現的位置,返回數字或者FALSE
strrpos: 查找子串最后一次出現的位置

  • 替換: str_replace
  • 格式化: printf, sprintf
  • 其他: str_repeat, str_shuffle

str_repeat: 重復N次
str_shuffle:隨機打亂

 

數組

定義方式

  • $a = array(1, 2, 3); //常用
  • $a = [1, 2, 3];
  • $a[] = 1; $a[1] = 2;

特點

  • 不指定下標,系統默認指定比目前已存在的數字下標中最大的數字大1的值(如不存在則為0)
  • 元素順序以放入順序為准,跟下標無關
  • 特殊下標:false變0,true變1,NULL變空字符串
  • 數組元素沒有類型和長度限制
  • php數組儲存在堆區,連續內存

多維數組

$info = array(
    array('name' => 'Jim', 'age' => 22),
    array('name' => 'Tom', 'age' => 28)
);

異形數組:數組元素中有基本類型也有數組

遍歷

  • foreach

foreach($info as [$下標 =>] $值){
//通過$下標訪問下標,通過$值訪問元素值
}

  • for

for() //count(array)獲取長度,下標必須是規律的數字

  • while配合each和list

each函數獲取當前元素的下標和值,同時指向下一個元素,返回4個元素的數組
0下標 => 元素下標值
1下標 => 元素的值
key下標 => 元素下標值
value下標 => 元素的值

如果取不到,返回false

//list,是結構不是函數。從數組從取值,賦值給一組變量。數組必須是從0開始的依次遞增的數字下標
list($first, $second)=$arr;
//list於each配合很好
while(list($key, $value) = each($arr))

 

數組相關函數

  • 排序函數

sort(); //順序
rsort; //逆序
asort(); //順序,數組索引保持和單元的關聯
arsort(); //逆序,保持索引關系
ksort(); //順序,按照鍵名排序
krsort(); //逆序,按照鍵名排序
shuffle(); //打亂,索引和單元關系不保持

  • 指針函數

reset(); //將數組內部指針指向第一個元素,並返回其值
end(); //將數組內部指針指向最后一個元素,並返回其值
next(); //下一個,當沒有更多元素時返回FALSE
prev(); //前一個,
current(); //獲取當前元素值
key(); //當前指針對應的下標
//next和prev一旦超出范圍之后,就回不去了。只能通過reset或者end進行指針重置

  • 其他函數

count(); //元素個數
array_push(); //往數組后面中加入一個元素
array_pop(); //從數組后面彈出一個元素並返回
array_shift(); //從數組前面彈出一個元素並返回
array_unshift(); //從數組前面壓入一個元素並返回
array_reverse(); //數組元素反轉
in_array(); //判斷元素是否在數組中
array_keys(); //返回一個數組的所有下標,返回一個索引數組
array_values(); //返回一個數組的所有值,返回一個索引數組
//可以模擬數據結構,棧和隊列


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM