PHP(一)基礎(chǔ)語法
本來就是學(xué)習(xí)筆記,就不說廢話了
參考
PHP 手冊
陳惠貞 , 陳俊榮.PHP 7&MySQL跨設(shè)備網(wǎng)站開發(fā)[M].北京:清華大學(xué)出版社,2017
PHP 教程
PHP 教程
PHP中變量的作用范圍
PHP中關(guān)于時間(戳)、時區(qū)、本地時間、UTC時間等的梳理
簡介
PHP("PHP: Hypertext Preprocessor",超文本預(yù)處理器的字母縮寫)是一種被廣泛應(yīng)用的開放源代碼的多用途腳本語言,它可嵌入到 HTML中,尤其適合 web 開發(fā)。
PHP 能做很多事。PHP不僅是生成網(wǎng)頁,了解更多參考PHP 手冊,我主要用來開發(fā)網(wǎng)站。
搭建環(huán)境: 網(wǎng)頁服務(wù)器Apache+PHP7+數(shù)據(jù)庫MySQL
搭建方法:WAMP
PHP文件
- PHP 文件可包含文本、HTML、JavaScript代碼和 PHP 代碼
- PHP 代碼在服務(wù)器上執(zhí)行,結(jié)果以純 HTML 形式返回給瀏覽器,用戶看不到php代碼
- PHP 文件的默認(rèn)文件擴(kuò)展名是 ".php"
用文本編輯器創(chuàng)建,拓展名為php的文件,瀏覽器打開127.0.0.1/...
例
創(chuàng)建hello.php
<?php
echo hello world
?>
1.php標(biāo)記
當(dāng)解析一個文件時,PHP 會尋找起始和結(jié)束標(biāo)記,例如 <?php 和 ?>,而標(biāo)記之外的內(nèi)容會被PHP解析器忽略,例如PHP與html混寫時,被PHP解析器忽略的部分直接輸給瀏覽器,由瀏覽器表達(dá)
開始和結(jié)束的種類
1
<?php
php代碼
?>
2.
<script language="php">
php代碼
</script>
3.
<?
php代碼
?>
4.
<%
php代碼
%>
注:
- 種類1和2總是可以用的,而且推薦使用
<?php PHP代碼 ?> - php標(biāo)記和php代碼之間最好以空格或回車隔開
短標(biāo)記(種類3)僅在通過php.ini配置文件中的指令 short_open_tag打開后才可用,或者在 PHP 編譯時加入了 **--enable-short-tags選項。
ASP風(fēng)格標(biāo)記(種類 4)僅在通過php.ini配置文件中的指令 asp_tags打開后才可用。
2.分號(指令分隔符)
同 C 或 Perl 一樣,PHP 需要在每個語句后用分號結(jié)束指令。
注:
- 在一段php代碼段(
<?php 代碼1;代碼2;代碼3;?>)最后一個代碼后面的分號;可省略,即省略代碼3后面的分號; - 在php文件的末尾,最后一個php結(jié)束標(biāo)記可不寫,但最后一個代碼后面的分號必須寫
例如a.php內(nèi)所有內(nèi)容
<?php echo hello; echo hello
?>
<?php echo hello; echo hello;
3.注釋
PHP 支持 C,C++ 和 Unix Shell 風(fēng)格(Perl 風(fēng)格)的注釋
- 單行注釋
#注釋內(nèi)容
//注釋內(nèi)容
- 多行注釋
/*注釋內(nèi)容
注釋*/
注:
- 單行注釋僅僅注釋到行末或者當(dāng)前的 PHP 代碼塊結(jié)束標(biāo)志,也就是說單行注釋 #與//能識別php結(jié)束標(biāo)記,即如果注釋所在行出現(xiàn)?>則意味著注釋結(jié)束,同時該php段結(jié)束
不過,</script> 標(biāo)記在單行注釋中不會跳出 PHP 模式。 - 多行注釋不支持嵌套,注釋在遇到第一個*/就結(jié)束注釋,例如
<?php echo hello; echo hello;
/* 注釋1/* 注釋2*/注釋 3
*/
#注釋有效范圍在第一個*/之間,也就是說注釋1和注釋2有效,注釋3*/會被php解釋器當(dāng)作代碼解釋,極易發(fā)生錯誤
?>
- 注釋方式僅在php標(biāo)記內(nèi)有效,如果混寫html代碼時,php外用html注釋方式
<!--注釋-->
4.備注
4.1 php與html的混寫
因為php只解釋php標(biāo)記內(nèi)的內(nèi)容,因此可以使 PHP 嵌入到 HTML 文檔中去,由瀏覽器解釋html標(biāo)簽
- 混寫示例
index.php
<!doctype html>
<html>
<head>
<title>標(biāo)題</title>
</head>
<body>
<?php
echo hello
?>
</body>
</html>
- 使用條件的高級分離術(shù)
PHP 將跳過條件語句未達(dá)成的段落,即使該段落位于 PHP 開始和結(jié)束標(biāo)記之外,因此 PHP 會根據(jù)條件來忽略html代碼。
例pp.php
<!doctype html>
<html>
<head>
<title>標(biāo)題</title>
</head>
<body>
<?php
if(1) #if (1)一定成立
{
?>
<h6>成立部分會顯示</h6>
<!--php標(biāo)記外,用html注釋方式-->
<!--分代碼兩側(cè)為php執(zhí)行的部分,所以,這部分的html代碼會被瀏覽器接收到-->
<?php
}
else #else肯定不成立了
{
?>
<h6>不成立的部分不顯示</h6>
<!--php代碼執(zhí)行的部分,html代碼也不會被瀏覽器接收-->
<?php
}
?>
</body>
</html>
輸出為

- 在瀏覽器上查看網(wǎng)頁源端代碼時,不會查看到php的源代碼,例如上述pp.php生成網(wǎng)頁,在瀏覽器上右鍵查看源代碼為
<!doctype html>
<html>
<head>
<title>標(biāo)題</title>
</head>
<body>
<h6>成立部分會顯示</h6>
<!--php標(biāo)記外,用html注釋方式-->
<!--分代碼兩側(cè)為php執(zhí)行的部分,所以,這部分的html代碼會被瀏覽器接收到-->
</body>
</html>
4.2 php Manual的建議
- 如果文件內(nèi)容是純 PHP 代碼,最好在文件末尾刪除 PHP 結(jié)束標(biāo)記。這可以避免在 PHP 結(jié)束標(biāo)記之后萬一意外加入了空格或者換行符,會導(dǎo)致 PHP 開始輸出這些空白,而腳本中此時并無輸出的意圖
- 如果將 PHP 嵌入到 XML 或 XHTML 中則需要使用 <?php ?> 標(biāo)記以保持符合標(biāo)準(zhǔn)。
數(shù)據(jù)類型
如果想查看某個表達(dá)式的值和類型,用 var_dump()
標(biāo)量型
1整數(shù)int
- 十進(jìn)制0或者非0開頭, 十六進(jìn)制( 以 0x 為前綴)或八進(jìn)制(前綴為 0)
2浮點數(shù)float
- 小數(shù),例
1.5 - 指數(shù),例
1.5e51.5e5
3布爾bool
- TRUE或者true,F(xiàn)alse或flase
4 字符串
4.1 單引號
'字母數(shù)字。。。等'
注:
- 除\'代表引號,\\代表\,無其他轉(zhuǎn)義字符
- 變量$X也不會被替換
- 可以錄入多行,換行等于空格,如
echo 'hello
world'
4.2 雙引號
"字符串 $變量名 等"
注
- 變量$X會被替換為變量本身值
- 支持轉(zhuǎn)義字符
- 單引號不需要轉(zhuǎn)義
| 序列 | 含義 |
|---|---|
| \n | 換行(ASCII 字符集中的 LF 或 0x0A (10)) |
| \r | 回車(ASCII 字符集中的 CR 或 0x0D (13)) |
| \t | 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) |
| \v | 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起) |
| \e | Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起) |
| \f | 換頁(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) |
| \\ | 反斜線 |
| \$ | 美元標(biāo)記 |
| \" | 雙引號 |
| \[0-7]{1,3} | 符合該正則表達(dá)式序列的是一個以八進(jìn)制方式來表達(dá)的字符 |
| \x[0-9A-Fa-f]{1,2} | 符合該正則表達(dá)式序列的是一個以十六進(jìn)制方式來表達(dá)的字符 |
4.3 heredoc 句法結(jié)構(gòu)
類似bash中的一樣,如下,注結(jié)束定界符EOF所在行除了EOF(或者后面有個分號;)外不能有任何其他字符。
其他語法與雙引號"一樣
$y=<<<EOF
hello
EOF;
4.4 nowdoc語法
即在heredoc基礎(chǔ)上在開始定界符EOF兩側(cè)加上單引號
語法與單引號'一樣
$y=<<<'EOF'
hello
EOF;
4.5 大括號{}的用法
在雙引號的語法中,可以替換變量$x的值
- 當(dāng)字符串和變量名相接時可以使用
字符串${變量名}字符串結(jié)構(gòu)或者字符串{$變量名}字符串 - 但是 echo "hello${a}world"不會報錯 echo hello${a}world會報錯,所以加上引號
- 只有$緊挨著{時才會被識別,否則正常輸出{,可以用{\$來表達(dá){$
例
$f='hello';
echo "{$f}</br>";
echo "{ $f}</br>"; //{與$之間有空格
echo "{\$f}</br>"; // \$轉(zhuǎn)義
結(jié)果為
hello
{ hello}
{$f}
特殊類型
1. NULL
UNLL表示一個變量沒有值,下列情況的變量被認(rèn)為是NULL
被賦值為NULL,尚未被賦值,被 unset()
var_dump(null);
var_dump(NULL);
var_dump($no_define); //隨便寫的一個沒定義的函數(shù)
結(jié)果為NULL NULL NULL只有類型沒有值
NULL不區(qū)分大小寫
2. 資源
對象
在后面專門講
變量&數(shù)組
1.變量
- 變量名是區(qū)分大小寫的
- 不必向 PHP 聲明該變量的數(shù)據(jù)類型,PHP 會根據(jù)變量的值,自動把變量轉(zhuǎn)換為正確的數(shù)據(jù)類型,而且可以隨時改變變量的數(shù)值、類型
$this 是一個特殊的變量,它不能被賦值
1.1定義使用
$變量名=值
- 變量賦值使用過程中必須有$,即
$變量名 -
&$變量名代表變量的地址 -
$$變量1代表以變量1的的值為變量名的變量,例
$b1=hello;
$$b1=world;
echo $hello; #顯示為world,$$b1即為$hello
1.2作用范圍
全局,局部在函數(shù)部分細(xì)說
1.3 系統(tǒng)變量
$this代表當(dāng)前對象
魔術(shù)變量,后面講
1.4 常量
- 常量使用const 定義,
const 常量名=值,定義和使用過程中都沒有$,常量的值必須是一個定值,不能是變量,類屬性,數(shù)學(xué)運算的結(jié)果或函數(shù)調(diào)用
2數(shù)組
- 數(shù)組大小無須聲明
- 數(shù)組元素類型不用相同
2.1定義使用
- 數(shù)組結(jié)構(gòu)
| key | key1 | key2 | key3 | ... | keyN |
|---|---|---|---|---|---|
| 值 | 值1 | 值2 | 值3 | ... | 值N |
默認(rèn)key為0,1,2,3,...,N,與C語言相同$數(shù)組名[N],PHP可以自定義key$數(shù)組名[key],key為整數(shù)或字符串
- 定義一維數(shù)組
#使用array()函數(shù)定義
$數(shù)組名=array(值1,值2,值3);
$數(shù)組名=array(key1=>值1,key2=>值2,key3=>值3);
#直接賦值
$數(shù)組名[key]=值
//例
$myarray=array('shandong'=>'濟(jì)南','beijing'=>'北京');
$myarray['jiangsu']='南京';
- 定義高維數(shù)組
以二維為例
$數(shù)組名=array(KEY1=>array(key1=>值11,key12=>值2,key13=>值3),KEY2=>array(key1=>值21,key2=>值22,key3=>值23))
2.2數(shù)組函數(shù)
查表就好了,略
2.3備注
對于高維數(shù)組,例如二維數(shù)組$myarray[0][1]與變量等價,$myarray[0]與數(shù)組等價,因此
$darray[0][0]='hello';
$darray[1]=100;
$darray[1][0]=100; //這行是在編輯器里是第39行
報錯Warning: Cannot use a scalar value as an array in C:\AppServ\www\ar.php on line 39
因為$darray[1]=100;這條代碼說$darray[1]與變量等價了,那么就不能再利用$darray[1][0],應(yīng)該和地址之類的有關(guān)吧,c語言的東西忘記了
運算
算數(shù)運算符
直接算就好了。。。
字符串運算符
連接字符串.(就是這個點)
$a=字符串a(chǎn).字符串b
.(點)和數(shù)字之間要用空格隔開
比較運算符
位元算符
注意& |一個是位運算符,&& ||兩個的是邏輯運算符
邏輯運算符
條件運算符
條件表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2
條件表達(dá)式位true時返回表達(dá)式1的值,false為表達(dá)式2
錯誤控制運算符@
@命令
就不會顯示錯誤信息了
但是@不能加在函數(shù)定義,類定義或流程控制等語句前面
執(zhí)行運算符-重音符`
類似bash里面的`
格式 `shell命令`
例
$a=`ping 127.0.0.1`;
echo $a;
流程控制
if
表達(dá)式兩端必須為括號(),即使表達(dá)式只有一個數(shù)字
if (表達(dá)式)
{
命令;
}
elseif (表達(dá)式) //elseif可以有很多次,也可無
{
命令;
}
else //最后為else,也可無
{
命令;
}
switch
表達(dá)式兩端必須為括號(),即使表達(dá)式只有一個數(shù)字
注意每個case都跟著一個break,不然會執(zhí)行到break為止
switch (表達(dá)式)
{
case 值1:
命令;
break;
case 值2:
命令;
break;
case 值3:
命令;
break;
default:
命令;
}
for
for (初始條件;判斷表達(dá)式;循環(huán)一次后操作)
{
命令;
}
foreach 結(jié)合數(shù)組使用
foreach ($一維數(shù)組名 as $value)
{
命令
}
value會依次取遍一維數(shù)組里面的值,若是二維數(shù)組名,則value每次循環(huán)都為字符串Array
value可自定義為其他變量名
foreach ($數(shù)組名 as $key => $value)
{
命令
}
key和value會依次取一維數(shù)組里的key和值,key和值可自定義為其他變量名
while
while (表達(dá)式)
{
命令;
}
do..while
while(表達(dá)式)最后別忘了分號;
do
{
命令;
}
while(表達(dá)式);
break continue exit()或者die()
- break 結(jié)束循環(huán)
- continue 返回循環(huán)開頭
- exit() 結(jié)束循環(huán)并返回,同時結(jié)束整個程序的執(zhí)行,后面的代碼也不繼續(xù)執(zhí)行了
exit()參數(shù)為0~254的整數(shù)時,終止網(wǎng)頁上不顯示信息,整數(shù)代表錯誤碼
exit()參數(shù)為字符串時,終止并在網(wǎng)頁上顯示信息,'8'表示字符串,'表示數(shù)字
例exit('文件打開失敗') - die()與exit()用法一樣
函數(shù)
- 函數(shù)名是大小寫無關(guān)的,不過在調(diào)用函數(shù)的時候,使用其在定義時相同的形式是個好習(xí)慣
1.定義
function 函數(shù)名 ( 輸入?yún)?shù)1,輸入?yún)?shù)2):返回值類型
//可無輸入?yún)?shù),可不寫返回值類型
{
命令;
return; // 或return 返回值;
}
- 輸入?yún)?shù)例
$x,$y類似matlab,也可為地址&$z,類似c語言 - 返回值類型(PHP7新功能),不寫則默認(rèn)返回return后面的值,如果寫返回值類型,則進(jìn)行格式轉(zhuǎn)換
- 函數(shù)默認(rèn)執(zhí)行到大括號結(jié)束處,如果要提早離開函數(shù),可以早使用return語句
例
function nam() :bool //返回類型設(shè)置為bool型
{
return (int)1; //函數(shù)內(nèi)部返回int型1
}
$han=nam();
echo var_dump($han);
//var_dump()函數(shù)返回輸入?yún)?shù)的類型和值
//結(jié)果為bool(true)返回值類型已由int轉(zhuǎn)為bool
2. 函數(shù)的位置
正常情況下,函數(shù)的定義和函數(shù)的調(diào)用是沒有位置要求的
但是當(dāng)函數(shù)在一些可能不會被執(zhí)行或者還沒執(zhí)行的{}內(nèi)時:
2.1 在函數(shù)內(nèi)定義的函數(shù)
- PHP 中的所有函數(shù)和類都具有全局作用域,可以在函數(shù)1內(nèi)定義函數(shù)2,然后在其他地方調(diào)用這個函數(shù),在函數(shù)1外定義函數(shù)2,也可以在函數(shù)1內(nèi)調(diào)用函數(shù)2
- 在函數(shù)1內(nèi)定義函數(shù)2時,只有函數(shù)1被執(zhí)行過一次,才能使用函數(shù)2,而且如果函數(shù)2的定義前已執(zhí)行return命令,則依然無法定義
也就是說,得讓系統(tǒng)在執(zhí)行函數(shù)1時”看到“函數(shù)2
例
//此處可以調(diào)用函數(shù)nam,不能調(diào)用函數(shù)nam1
$han=nam(10);
//已執(zhí)行過nam,系統(tǒng)已知道有個nam1函數(shù),可以執(zhí)行nam1函數(shù)了
$han1=nam1(20);
function nam($b)
{
function nam1($a)
{
return $a;
}
return (int)$b;
}
2.1 在條件內(nèi)定義函數(shù)
- 當(dāng)函數(shù)在條件判斷的語句內(nèi)定義式,只有在函數(shù)定義所在處被執(zhí)行,才能調(diào)用函數(shù),同時函數(shù)的調(diào)用也必定是在函數(shù)定義之后
例
//此時系統(tǒng)沒見過han1和han2都不可以調(diào)用
if (false)
{function han1()
{return 'han1';
}
}
else
{function han2()
{return 'han2';
}
}
echo han1();//han1函數(shù)定義所在處未被執(zhí)行,系統(tǒng)不認(rèn)識han1(),執(zhí)行失敗
echo han2();//han2函數(shù)的定義被系統(tǒng)看見了,調(diào)用正常
3. 參數(shù)
3.1 傳值調(diào)用
function han($a,$b);
3.2 傳址調(diào)用
function han(&$a,&$b)
//&為取地址符
很類似c語言里的傳值傳址調(diào)用
3.3 設(shè)置參數(shù)默認(rèn)值
即如果調(diào)用函數(shù)時未提供參數(shù),默認(rèn)的參數(shù)
function han($a=默認(rèn)參數(shù))
3.4 可變長參數(shù)列表
- PHP5.6以后可以,不指定參數(shù)個數(shù),輸入的參數(shù),變成一個數(shù)組,在函數(shù)內(nèi)調(diào)用數(shù)組的每個元素,即可使用每個參數(shù)
function han(...$a)
//a為傳入的所有參數(shù)構(gòu)成的數(shù)組名
//注意僅多了三個點...
4. 變量的作用域,生存期
4.1 局部變量
- 在函數(shù)內(nèi)定義和使用的變量,一般函數(shù)調(diào)用結(jié)束后就釋放掉了,下次再調(diào)用函數(shù)跟第一次調(diào)用一樣
- 傳遞給函數(shù)的參量,調(diào)用后釋放
- 靜態(tài)變量,函數(shù)調(diào)用后,靜態(tài)變量的值不被釋放,下次調(diào)用函數(shù)使用上次的值,定義語句
static $a=值只在第一次調(diào)用函數(shù)時有效,變量的值一直保存
例
function han()
{static $a=0; //定義靜態(tài)變量
$a=$a+1;
echo $a;
}
han(); //顯示1
han(); //顯示2,說明靜態(tài)變量a的值再調(diào)用后沒有釋放
4.2 全局變量
- 在函數(shù)外定義的變量
- 在函數(shù)內(nèi)調(diào)用全局變量
global $變量名
例
<?php
$a="hello,world"; //定義全部變量$a
function hello()
{global $a; //調(diào)用全局變量$a
echo $a;}
hello();
?>
5. 備注
5.1 匿名函數(shù)
從PHP5.3開始支持匿名函數(shù)
格式
$han = function($a)
{
echo $a;
}; //注意這個分號;別漏了,這算是對變量han的定義,所以要有分號;結(jié)束
$han('apple'); //使用$han調(diào)用
猜測han指定為函數(shù)的地址之類的了,c語言地址的知識忘記了,不是很確定
5.2 可變函數(shù)
當(dāng)某個變量后面跟著小括號()時,PHP會找出這個變量所代表的值,然后執(zhí)行同名的函數(shù)
例
function han()
{echo 'hello';
}
$test="han";
$test(); //注意因為$test才能說明test是變量,所以必須要有$
內(nèi)建函數(shù)
查表吧
常用函數(shù)
echo
- 格式
echo 字符串或echo(字符串) - echo 是語言結(jié)構(gòu),沒有返回值,不能作為表達(dá)式
- echo 可以輸出一個或多個字符串,例
echo "hello","world";,但是echo()括號內(nèi)好像只能接受一個字符串 - 字符串里可包含html代碼,例
echo "hello<br>world",注意html代碼要在字符串內(nèi)部,或者兩邊有引號
- 格式
print 字符串或print(字符串) - print是函數(shù),字符串成功顯示返回true,失敗返回false,可以作為表達(dá)式
- print 只允許輸出一個字符串,例
print "hello"."world";//而不能print "hello","world" - 字符串里可包含html代碼
var_dump()
輸出變量的類型、長度、數(shù)值
長度為1的例如整數(shù)就不顯示個數(shù)了
如果是數(shù)組,則展示數(shù)組,元素數(shù),key和值
例
$a="hello";
$b=array(1,2,3,4);
$c=10;
$e=array(array(1,2),array(3,4));
var_dump($a);
echo "<br>";
var_dump($b);
echo "<br>";
var_dump($c);
echo "<br>";
var_dump($e);
結(jié)果為
histring(5) "hello"
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
int(10)
hiarray(2) { [0]=> array(2) { [0]=> int(1) [1]=> int(2) } [1]=> array(2) { [0]=> int(3) [1]=> int(4) } }
include'文件' 和 require'文件'
引入文件,等價于把引入文件的源代碼復(fù)制粘貼到此處(在服務(wù)器執(zhí)行它之前)
include 和 require 語句是相同的,除了錯誤處理方面:
- require 會生成致命錯誤(E_COMPILE_ERROR)并停止腳本
- include 只生成警告(E_WARNING),并且腳本會繼續(xù)
包含文件省去了大量的工作??梢詾樗许撁鎰?chuàng)建標(biāo)準(zhǔn)頁頭、頁腳或者菜單文件。然后,在頁頭需要更新時,只需更新這個頁頭包含文件即可。
對象
類似c語言的結(jié)構(gòu)體
- 類 是對象的格式(模板),規(guī)定了具體哪些屬性(變量)和方法(函數(shù))
- 對象 類的具體化,基于類創(chuàng)建的一種類型
如果以汽車對比的話如圖,不過我感覺學(xué)過c語言結(jié)構(gòu)體的人馬上就懂了

1.類
1. 1 格式
定義
class 類名 //子類的定義為 class 子類名 extends 父類名
{
屬性的訪問級別 $變量名=值; //也可只定義不賦值
方法的訪問級別 function 函數(shù)名()
{
函數(shù)體
}
const 常數(shù)名=值; //定義常數(shù)的方法,注意常數(shù)名前沒有$,常數(shù)名習(xí)慣大寫,使用時也沒有$
//還可以有構(gòu)造函數(shù),析構(gòu)函數(shù)
}
1.2 說明
- class 用于定義類
- 屬性 就是存放數(shù)據(jù)的變量
- 方法 就是類內(nèi)的函數(shù)
- 類內(nèi)的函數(shù)和類外的函數(shù)一樣,變量也有局部和全局變量之分
- 可在類外或者其他類內(nèi)調(diào)用類內(nèi)定義的變量/函數(shù),使用::進(jìn)行調(diào)用,能否調(diào)用由訪問級別決定
例
類名::函數(shù)名()
- 訪問級別 就是變量或者函數(shù)的作用域
有
| 訪問級別 | 作用域 |
|---|---|
| public或者var | 任何程序代碼訪問 |
| protected | 能被其所在類內(nèi)訪問,子類可以訪問 |
| private | 只能被其所在類內(nèi)訪問,子類不能訪問 |
變量必須指明訪問級別,函數(shù)不指明則默認(rèn)為public
常量使用const 定義,
const 常量名=值,定義和使用過程中都沒有$,常量的值必須是一個定值,不能是變量,類屬性,數(shù)學(xué)運算的結(jié)果或函數(shù)調(diào)用繼承 在定義一個新類的時,可以在一個已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并加入若干新的內(nèi)容,稱這個新類繼承了舊類
父類 一個類被其他類繼承,可將該類稱為父類,或基類,或超類
子類 一個類繼承其他類稱為子類,也可稱為派生類
一個類可以是一個類的父類,另一個類的子類
子類可以繼承父類的非私有(private)變量/函數(shù)
如果子類對父類中出現(xiàn)的變量/函數(shù)重新定義,則使用子類的定義,稱為覆蓋,調(diào)用被覆蓋的變量/函數(shù)可以
父類名::變量/函數(shù)或parent::變量/函數(shù),就是正常的調(diào)用方法PHP中子類最多只能繼承一個父類
定義方法
class 子類名 extends 父類名
{
}
- 特殊的類名
自身 self
父類 parent
例調(diào)用類自身中的函數(shù)除了上述方法還可以
parent::函數(shù)名()
- 例
class lei
{
public $a=1;
function han() //類內(nèi)函數(shù),訪問級別默認(rèn)public
{
echo "</br>hello明</br>";
}
function test()
{
echo lei::PI; //調(diào)用類lei內(nèi)的PI常數(shù),也可以self::PI
self::han(); //調(diào)用自身的han()函數(shù)
echo lei::$a;//函數(shù)體內(nèi)沒有變量$a,需要lei::$a或者self::$a來調(diào)用類內(nèi)的變量
}
}
class zilei extends lei //創(chuàng)建繼承l(wèi)ei的子類zilei
{
function test() //重寫test函數(shù),使用zilei類時,以重定義的為準(zhǔn),不影響父類中的定義使用
{
echo hello;
each parent::$a; //調(diào)用父類中的$a,也可以lei::$a
}
lei::test() //調(diào)用lei內(nèi)的test()函數(shù)
2. 對象
2.1 格式
定義
$對象名=new 類名(); //如果有輸入?yún)?shù)在()內(nèi)輸入
匿名定義,和匿名函數(shù)一樣
$對象名=new class(輸入?yún)?shù))
{
類語句;
}; //這里的分號;要有,和匿名函數(shù)一樣嘛
也有類似可變函數(shù),字符串()表示相應(yīng)函數(shù),new 字符串表示創(chuàng)建對象的定義方法
使用
$對象名->變量名=值; //注意變量名前沒有$
$對象名->函數(shù)名();
特殊的對象名:$this代表當(dāng)前對象,可在類內(nèi)使用
3. 更多內(nèi)容
3.1 構(gòu)造函數(shù)&析構(gòu)函數(shù)
-
構(gòu)造函數(shù)是用來將對象初始化的函數(shù),在創(chuàng)建對象時自動執(zhí)行
有無參數(shù)都可,參數(shù)是在__construct()里面定義的,不是在類名后面,沒有返回值
function __construct (輸入?yún)?shù)) //注意是兩個下劃線和construct
{
}
-
析構(gòu)函數(shù)是在釋放對象時自動執(zhí)行的函數(shù)
沒有參數(shù),沒有返回值
function __destruct () //注意是兩個下劃線和construct
{
}
- 例
class lei
{
public $name;
function __construct($str)
{
$this->name=$str; //$this代表當(dāng)前對象
echo "已成功創(chuàng)建名字為{$this->name}的對象</br>";
}
function __destruct()
{
echo "已成功釋放對象";
}
}
$duix=new lei("小明");
$duix=NULL;
運行結(jié)果
已成功創(chuàng)建名字為小明的對象
已成功釋放對象
3.2 抽象方法/抽象函數(shù)
- 抽象類,如果類內(nèi)定義了一個抽象函數(shù),則他必須也定義為抽象類
abstract class 抽象類名
- 定義為抽象的類不能用于定義對象,會報錯
Fatal error: Uncaught Error: Cannot instantiate abstract class 抽象類名 - 抽象類內(nèi)的抽象函數(shù)只能說明參數(shù),不能有函數(shù)具體形式,即只能寫
abstract funtion 函數(shù)名(輸入?yún)?shù))后面不能再有{}包含的函數(shù)體,否則報錯Abstract function 抽象類::抽象函數(shù)() cannot contain body - 抽象類內(nèi)非抽象函數(shù)不受限制
- 子類繼承抽象類,子類內(nèi)必須定義父類中的抽象函數(shù),而且輸入?yún)?shù)必須與抽象函數(shù),訪問級別和父類相同或著比父類更寬松,可以簡單理解為寫父類抽象函數(shù)的函數(shù)體
例
abstract class chou //定義抽象類
{
abstract function fun1($a,$b); //抽象函數(shù),不能有函數(shù)體
}
class zichou extends chou //定義子類,父類是抽象類chou
{
function fun1($a,$b) //必須定義與抽象函數(shù)相同的函數(shù)
{
echo "$a"."$b";
}
}
3.3 final
PHP 5 新增了一個 final 關(guān)鍵字。
- 如果父類中的方法(函數(shù))被聲明為 final,則子類無法覆蓋該方法
final republic function 函數(shù)名() //函數(shù)名前單詞較多,別忘記了
{函數(shù)體
}
- 如果一個類被聲明為 final,則不能被繼承。
3.4 static
- 在類內(nèi)定義 static 變量便可以在類外訪問,否則會報錯
- 函數(shù)無論是否static 都可被訪問
定義方法
static 訪問級別 $變量名
static 訪問級別 function 函數(shù)名()
{
}
例
class lei
{
static public $hel=5; //變量前參數(shù)多,容易漏寫
public $he=6;
static function fun()
{
echo hello1."<br>";
}
function fun2()
{
echo hello2."<br>";
}
}
echo lei::$hel;
echo lei::$he; //會報錯,不能使用非static變量
lei::fun();
lei::fun2();
3.4 接口(不知道干什么用的?)
- 使用接口(interface),可以在接口中指定類必須包含的方法(函數(shù))
- 不能在接口內(nèi)定義函數(shù)體,而且訪問級別只能是public型,這是接口的特性
- 只能在類中定義函數(shù)體,訪問級別必須與接口內(nèi)相同,因此只能public
接口格式
interface 接口名
{
public function 函數(shù)名(); //public可省略
}
使用接口的類
class 類名 implements 接口1,接口2,接口3... //可以有1到多個接口
{
function 函數(shù)名() //必須有每個接口的函數(shù)
{
echo hello;
}
其他接口函數(shù)
}
例
interface jiekou //定義接口jiekou
{
public function fun(); //接口函數(shù)
}
interface jiekou2 //定義接口jiekou2
{
function fun2(); //接口函數(shù)類型只能public或不寫(就代表public)
}
class lei implements jiekou,jiekou2 //定義類lei,接口有jiekou,jiekou2
{
function fun()
{
echo hello;
}
function fun2()
{
echo world;
}
}
命名空間 namespace
變量、數(shù)組不受命名空間的影響
類/函數(shù)/常量 須使用命名空間前綴(不帶前綴表示當(dāng)前命名空間)
1. 簡單認(rèn)識命名空間
1.1 文件夾&文件 命名空間&類/函數(shù)/常量
- 命名空間和類/函數(shù)/常量的關(guān)系類似與文件夾和文件的關(guān)系,同一文件夾(命名空間)內(nèi)文件(類/函數(shù)/常量)不能重名,而不同文件夾(命名空間)下可以重名
- 我們可以通過 目錄+文件名來使用某一文件如
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
同樣,我們也可以使用命名空間+類/函數(shù)/常量來使用某一命名空間的類/函數(shù)/常量
- 如下代表根命名空間(全局空間)中的命名空間1中命名空間2內(nèi)的類/函數(shù)/常量,與目錄的絕對路徑類似
\命名空間1\命名空間2\類/函數(shù)/常量
- 如下代表當(dāng)前命名空間下面的命名空間1下的類/函數(shù)/常量,與目錄的相對路徑類似
命名空間1\類/函數(shù)/常量
- 如下代表當(dāng)前命名空間下面的類/函數(shù)/常量
類/函數(shù)/常量
- 進(jìn)入命名空間就像進(jìn)入文件夾一樣(不存在這一命名空間則自動創(chuàng)建),然后在這個命名空間(文件夾)下進(jìn)行各種操作,例如創(chuàng)建類/函數(shù)/常量等
1.2 PHP中的namespace 與 shell 里的 cd
默認(rèn)情況下(不使用namespace時),所有變量、數(shù)組,常量,類和函數(shù),等都放在全局空間(理解為根命名空間)下
namespace類似與shell中的cd命名,可以使用namespce 切換命名空間,例進(jìn)入某一目錄
cd \home\chen,對于命名空間namespace 命名空間路徑,相對于cd而言 namespace 后面只能是絕對路徑(命名空間的絕對地址),而且根目錄(全局空間)不寫斜杠\,默認(rèn)開頭就是全局空間下,不同于:命名空間中的類/函數(shù)/常量支持相對路徑和絕對路徑,而且使用類/函數(shù)/常量時根目錄(全局空間)要加\
namespace 命名空間1;
# 代表進(jìn)入全局空間下的命名空間1,絕對路徑
namespace 命名空間1\命名空間2;
# 代表進(jìn)入全局空間下的命名空間1下的命名空間2
命名空間1\類/函數(shù)/常量 ,絕對路徑
# 當(dāng)前命名空間下面的命名空間1下的類/函數(shù)/常量,相對路徑類似
\命名空間1\命名空間2\類/函數(shù)/常量
# 根命名空間(全局空間)中的命名空間1中命名空間2內(nèi)的類/函數(shù)/常量,絕對路徑
- 要么不用namspace,所有類/函數(shù)/常量全在全局空間下面
- 要么用namespace,則必須在文檔的開頭就使用namespace表示所在命名空間,且無法切換到全局空間創(chuàng)建使用類/函數(shù)/常量
2. 語法
在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的 declare 語句,例declare(encoding='UTF-8'),其他所有代碼包括空白符,html標(biāo)簽都不能出現(xiàn)在命名空間的聲明之前。
2.1 使用/切換命名空間格式
分號法
<?php
namesapce 命名空間名1;
php代碼。。。
namesapce 命名空間名2;
php代碼。。。
?>
大括號法
<?php
namesapce 命名空間名1
{
php代碼。。。
}
namesapce 命名空間名2
{
php代碼。。。
}
?>
全局命名空間
namespace
{
}
- 使用大括號{表示或者分號;表示,兩種方法不能混用,所以要使用全局命名空間只能使用大括號{表示法
2.2 使用命名空間中的類/函數(shù)/常量
注意:變量,數(shù)組不受命名空間影響
格式:路徑\類/函數(shù)/常量
2.2.1 不寫路徑,表當(dāng)前
例如 $a=new foo(); 或 foo::staticmethod();。如果當(dāng)前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo,
如果當(dāng)前空間沒有則為全局空間下類/函數(shù)/常量,即\類/函數(shù)/常量
2.2.2 相對路徑,當(dāng)前下
例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當(dāng)前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo
2.2.3 絕對路徑,\開頭
例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();,foo 被解析為\currentnamespace\foo
3.別名/導(dǎo)入命名空間
可以理解為建立了一個快捷方式,不過該快捷方式僅在該命名空間下有效
僅支持給命名空間和類建立別名
3.1 語法
- user 路徑\命名空間/類 as 別名
- user 路徑\命名空間/類,別名默認(rèn)為命名空間/類的名字
-
user 路徑\命名空間/類 as 別名,user 路徑\命名空間/類,用逗號隔開多個別名語句
例
<?php
namespace hello\hi
{
$a=1;
function han1()
{
echo hello;
}
}
namespace
{
use \hello\hi; //別名,默認(rèn)為hi
hi\han1(); //使用hi替代\hello\hi
}
?>
3. 備注
特殊的關(guān)鍵字
namespace即可以切換命名空間,也表示當(dāng)前命名空間的路徑
__NAMESPACE__魔術(shù)變量表示當(dāng)前命名空間的名稱(字符串)
魔術(shù)變量
__LINE__
文件中的當(dāng)前行號。
__FILE__
文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。
__DIR__
文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。
它等價于 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增)
__FUNCTION__
函數(shù)名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數(shù)被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。
__CLASS__
類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區(qū)分大小寫)。
在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區(qū)域(例如 Foo\Bar)。注意自 PHP 5.4 起__CLASS__ 對 trait 也起作用。當(dāng)用在 trait 方法中時,__CLASS__是調(diào)用 trait 方法的類的名字。
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 實現(xiàn)了代碼復(fù)用的一個方法,稱為 traits。
Trait 名包括其被聲明的作用區(qū)域(例如 Foo\Bar)。
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優(yōu)先順序是當(dāng)前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
__METHOD__
類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區(qū)分大小寫)。
__NAMESPACE__
當(dāng)前命名空間的名稱(區(qū)分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。
顯示時間
1. 時間 date()
date() 函數(shù)用于格式化時間/日期
1.1 格式
date("返回格式",指定時間戳)
date()返回值類型為字符串,返回UNIX時間戳,從1970/1/1到當(dāng)前或者指定的時間戳
返回格式為單個字母,可連續(xù)寫可用符號隔開
指定時間戳,不寫默認(rèn)為當(dāng)前時間
1.2 返回格式
參見date — 格式化一個本地時間/日期

例
<?php
echo date("TYmd l g:i:s A")
?>
結(jié)果
UTC20170822 Tuesday 12:01:50 PM
顯示的時UTC的時間,而我們處在東八區(qū)
可以
<?php
date_default_timezone_set('Asia/Shanghai');
echo date("TYmd l g:i:s A")
?>
結(jié)果
CST20170822 Tuesday 8:10:24 PM