20170812PHP學(xué)習(xí)(一)基礎(chǔ)語法

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. 種類1和2總是可以用的,而且推薦使用<?php PHP代碼 ?>
  2. php標(biāo)記和php代碼之間最好以空格或回車隔開
  3. 短標(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é)束指令。
注:

  1. 在一段php代碼段(<?php 代碼1;代碼2;代碼3;?>)最后一個代碼后面的分號;可省略,即省略代碼3后面的分號;
  2. 在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.5e5 1.5e5

3布爾bool

  • TRUE或者true,F(xiàn)alse或flase

4 字符串

4.1 單引號
'字母數(shù)字。。。等'

注:

  1. 除\'代表引號,\\代表\,無其他轉(zhuǎn)義字符
  2. 變量$X也不會被替換
  3. 可以錄入多行,換行等于空格,如
echo 'hello
world'
4.2 雙引號
"字符串 $變量名 等"

  1. 變量$X會被替換為變量本身值
  2. 支持轉(zhuǎn)義字符
  3. 單引號不需要轉(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(字符串)
  • 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

更多參考PHP中關(guān)于時間(戳)、時區(qū)、本地時間、UTC時間等的梳理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容