思考:PHP是一種運行在服務(wù)器端的腳本語言沦童,可以嵌入到HTML中開發(fā)撑碴。也就是說混入到HTML中(還有CSS和JavaScript)的PHP代碼要被PHP解釋器“取出來”撑教,然后轉(zhuǎn)變成HTML,最后才能交給瀏覽器去解析醉拓。那么伟姐,PHP解釋器憑什么能夠從一堆“亂七八糟”代碼中準(zhǔn)確識別PHP部分呢?
引入:混到一塊的內(nèi)容要加以區(qū)分廉嚼,必須要有一個不同于其他內(nèi)容的規(guī)則玫镐,而PHP的代碼本身無法做到,因此需要有一個類似JavaScript的標(biāo)簽來區(qū)分怠噪,然后可以將PHP的代碼邏輯寫到指定的標(biāo)簽內(nèi)恐似,就可以實現(xiàn)PHP的獨立識別了。
PHP標(biāo)簽【掌握】
定義:PHP標(biāo)記是一種不對稱的雙標(biāo)記傍念,而且可以根據(jù)實際所處的位置變成必要的不完整標(biāo)記矫夷。PHP解釋器會將從標(biāo)記開始,將標(biāo)記內(nèi)的所有內(nèi)容當(dāng)做PHP的代碼來解析憋槐。
1.標(biāo)記規(guī)則:標(biāo)準(zhǔn)規(guī)則双藕,通常是嵌入到HTML中的時候使用
<?php
//標(biāo)記起始為:<?php
//PHP代碼塊
//標(biāo)記結(jié)束為:?>
?>
2.標(biāo)記規(guī)則:不完整規(guī)則,通常是獨立的PHP文件(全部是PHP代碼)使用
<?php
//只有起始標(biāo)記
//PHP代碼塊
//沒有結(jié)束標(biāo)記
3.標(biāo)記規(guī)則:歷史規(guī)則阳仔,PHP在早起經(jīng)歷了多種標(biāo)記忧陪,現(xiàn)在已經(jīng)幾乎都不用,但是如果碰到近范,要認(rèn)識
短標(biāo)記:short_tag
<?
//短標(biāo)記:起始標(biāo)記沒有PHP
//目前默認(rèn)不支持嘶摊,如果要支持需要開啟配置php.ini:short_open_tag = On
?>
*********************************************************************
ASP標(biāo)記:asp_tag
<%
//ASP標(biāo)記:以前ASP語言的方式
//PHP7已經(jīng)明確不支持
%>
*********************************************************************
腳本標(biāo)記
<script language="php">
//腳本標(biāo)記:與JavaScript一樣
</script>
總結(jié):PHP因為其語言特殊性,需要使用標(biāo)記來人為的區(qū)分评矩,因此必須使用PHP所對應(yīng)的標(biāo)記叶堆。標(biāo)記的主要方式有兩種:
- 嵌入到HTML中:必須使用起始和結(jié)束標(biāo)記
- 獨立PHP文件:使用起始標(biāo)記即可
思考:代碼一旦寫起來一來會隨著業(yè)務(wù)復(fù)雜度的上升而變得多而復(fù)雜,二來項目的開發(fā)通常需要與團隊共享代碼斥杜,三來會因為團隊人員的變更而導(dǎo)致不同的人去更新別人的代碼虱颗。那么這個時候就會出現(xiàn)一個效率問題:為了能夠去完善代碼沥匈,個人可能需要去讀懂全部代碼才知道如何下手,這樣的效率通常會不如完全重新開發(fā)一套系統(tǒng)忘渔,如何解決高帖?
引入:想要讓代碼的可讀性變強,可擴展性變強辨萍,就需要對代碼的邏輯棋恼、針對的業(yè)務(wù)、設(shè)計的關(guān)聯(lián)等做出明確的說明锈玉,這種說明就是代碼中所常用的文字描述爪飘,俗稱注釋。而這種描述本身會在代碼被解析的時候自動忽略掉拉背,因此只會方便寫代碼和讀代碼的人师崎,而不會額外的給程序本身增加任何壓力。
PHP注釋【掌握】
定義:注釋椅棺,為了方便程序的迭代開發(fā)和管理犁罩,使用特定的符號將描述的自然語言進行標(biāo)記,方便開發(fā)人員理解代碼并不會給程序本身增加額外效率損失。
1.注釋規(guī)則:單行注釋,使用的注釋符號只會讓符號后面的內(nèi)容被PHP解釋器忽略士葫,有#和//兩種
<?php
#這是注釋君丁,后面所有的內(nèi)容在PHP解析的時候都忽略
//這也是注釋仍秤,與#符號效果一樣
這行代碼不受影響:因為上面的符號只能保證自己行//后面內(nèi)容會被忽略
?>
2.注釋規(guī)則:注釋多行(塊注釋),從起始符號開始,直到結(jié)束符號前都是注釋,起始符號為“/*”递胧,結(jié)束符號為“*/”
<?php
/*從這里開始注釋
依然在注釋內(nèi)容
到此才結(jié)束*/
?>
總結(jié):PHP的注釋是很有必要的,分為單行注釋和塊注釋赡茸,一般短注釋使用單行注釋缎脾,而注釋內(nèi)容較多又涉及分行的話使用塊注釋。一個良好的軟件有一個共同的特性占卧,就是代碼的可讀性強遗菠,因此作為一名優(yōu)秀的程序員寫出來的優(yōu)秀代碼,都是有注釋說明的华蜒。
思考:目前所有的編程語言幾乎都是英文單詞去構(gòu)成的舷蒲,而目前除了Python語句是以行為單位自動“結(jié)算”外,其他語言基本上都是需要程序員手動去控制的友多。如何能夠告訴PHP解釋器代碼什么時候該結(jié)束了呢?
引入:PHP的代碼結(jié)束機制是通過程序員輸入的結(jié)束符號來控制堤框,這個符號就是英文狀態(tài)下的分號:“;”域滥,一旦碰到這個纵柿,系統(tǒng)會認(rèn)為從前面到分號前的所有代碼是一個整體(特殊狀況除外,如括號“()”和花括號“{}”)
PHP語句結(jié)束符【掌握】
定義:PHP的代碼在寫完之后启绰,通常會有一個語句結(jié)束符昂儒,該符號使用英文輸入法狀態(tài)下的分號:“;”
1.使用規(guī)則,單行代碼需要在代碼結(jié)束出增加“;”告知PHP引擎代碼結(jié)束了
<?php
//輸出hello world
echo 'hello world'; //此處;為語句結(jié)束符委可,告知PHP解釋器echo 'hello world'是一個整體
?>
2.PHP語句結(jié)束符的特殊性【了解】:如果PHP在有結(jié)束標(biāo)記?>的情況下渊跋,那么最后一條PHP語句可以沒有語句結(jié)束符。
<?php
echo 'hello world'; //這個語句結(jié)束符必須有
echo 'bye-bye' //因為最后一條着倾,且后面跟?>拾酝,所以可以省去(不建議)
?>
總結(jié):PHP語句結(jié)束符作為PHP語句的結(jié)束標(biāo)志,是主動用來告知PHP解釋器的基本符號卡者,平常在使用的時候一定不要忘記蒿囤。
PHP基礎(chǔ)語法
思考:PHP是作為一種動態(tài)腳本語言來支撐Web2.0的,而動態(tài)網(wǎng)站的顯著特性是能夠與用戶進行交互崇决,交互的內(nèi)容是什么材诽?本質(zhì)就是各種數(shù)據(jù),但是PHP是一種運行在內(nèi)存的代碼恒傻,那么意味著在內(nèi)存運行周期中脸侥,用戶與服務(wù)器交互的數(shù)據(jù)就由PHP來承擔(dān),PHP要怎么來保留這些數(shù)據(jù)呢盈厘?
引入:PHP運行在計算機內(nèi)存中睁枕,內(nèi)存就是一種效率很高的存儲介質(zhì),數(shù)據(jù)既然需要通過PHP來進行處理扑庞,那么PHP就需要將數(shù)據(jù)進行臨時的保存譬重,這種臨時保存的機制就是通過PHP內(nèi)定的量來控制,而量又分為兩種:變量和常量
PHP變量【掌握】
定義:PHP變量罐氨,是一種在PHP腳本運行周期內(nèi)(從一個腳本的第一行代碼執(zhí)行到最后一行執(zhí)行完成)臀规,系統(tǒng)通過指定的標(biāo)識符,以“$”符號開始栅隐,指向保存在內(nèi)存中的數(shù)據(jù)塔嬉,從而在代碼運行過程中,可以通過標(biāo)識符來獲得對數(shù)據(jù)的使用的一種代碼形態(tài)租悄。
1.PHP變量命名規(guī)則
- 必須以$符號開始
- 由字母谨究、數(shù)字和下劃線組成
- 變量嚴(yán)格區(qū)分大小寫
- 其中數(shù)字不能在開頭(不能直接跟$符號后)
- 變量命名應(yīng)盡量與事實需求響應(yīng)(識別度高),如名字對應(yīng)
age等等
- 比較復(fù)雜的復(fù)合命名變量可以使用下劃線法(用下劃線連接單詞胶哲,推薦)或者駝峰法(單詞首字母大寫):下劃線法
familyName
<?php
//變量規(guī)則
$abc = 1; //有效變量名
$a_3 = 1; //有效變量名
$3_a = 1; //無效變量名
?>
2.PHP變量使用:PHP是一種弱類型語言潭辈,即變量的定義可以直接使用鸯屿,且不用管實際賦值給變量的數(shù)據(jù)是什么樣子
<?php
//定義變量
$abc = 1; //定義且賦值澈吨,表示$abc以后就代表1這個數(shù)值
$abc = 'abc';//PHP重新定義,表示$abc以后代表'abc'不再代表1(修改變量)
//訪問
echo $abc; //訪問PHP變量寄摆,表示輸出$abc代表的數(shù)據(jù)'abc'谅辣,最終輸出abc字符串
//查看變量詳情
var_dump($abc); //包括變量名字長度,所保存的數(shù)據(jù)類型等
//刪除
unset($abc); //刪除$abc變量婶恼,表示將$abc這個符號清理掉桑阶,后續(xù)就不再刻意訪問該變量
echo $abc; //錯誤:系統(tǒng)提示沒有一個叫做$abc的變量
?>
3.變量的生命周期:變量的存在是為了保證程序在運行過程中能夠有效的訪問數(shù)據(jù),所以PHP變量的生命周期是兩種:1是人為的刪除變量(上例中unset刪除變量)勾邦;2是腳本執(zhí)行結(jié)束(最后一行代碼執(zhí)行完畢)
4.預(yù)定義變量:系統(tǒng)中為了方便程序員開發(fā)蚣录,將很多需要用戶很麻煩操作的變量制作成了系統(tǒng)變量,用戶可以直接調(diào)用就能獲取相應(yīng)的數(shù)據(jù)結(jié)果检痰。預(yù)定義變量通常都是數(shù)組數(shù)據(jù)包归。
- $_GET:用戶通過get方式提交的數(shù)據(jù)
- $_POST:用戶通過post方式提交的數(shù)據(jù)
- $_REQUEST:用戶通過get和post提交的數(shù)據(jù)
- $_SERVER:用戶和服務(wù)器的基本信息數(shù)據(jù)
- $_FILES:用戶提交的文件數(shù)據(jù)
- $_SESSION:session數(shù)據(jù)
- $_COOKIE:cookie數(shù)據(jù)
- $GLOBALS:所有全局變量,也是唯一一個不是以下劃線開始的預(yù)定義變量
- $_ENV:環(huán)境數(shù)據(jù)
5.變量傳值:指的是將變量賦值給另外一個變量铅歼,在PHP中通常有兩種方式來實現(xiàn)變量傳值
- 值傳遞:將變量的值賦值給另外一個變量公壤,兩個變量擁有同樣的值,但是兩個變量互不影響
- 引用傳遞:將變量所指向的數(shù)據(jù)的內(nèi)存地址賦值給另外一個變量椎椰,兩個變量指向同一個值厦幅,任何一個的修改都會影響到另外一個變量
<?php
$a = 100;
$b = $a; //將$a保存的值100賦值給$b
$c = &$a; //將$a指向的100的地址賦值給$c
echo $a,$b,$c; //100,100,100
$b = 'b'; //改變$b的結(jié)果,但是$a不受影響慨飘,依然是100
echo $a,$b,$c; //100,b,100
$c = 'c'; //改變$c的結(jié)果确憨,但是$a與$c公用一個數(shù)值空間,所以$a也會變成'c'
echo $a,$b,$c; //c,b,c
?>
6.變量內(nèi)存分析:計算機中內(nèi)存大致分為棧瓤的、堆休弃、數(shù)據(jù)段和代碼段
- 棧:效率高,但是少圈膏,主要存放變量名字和變量索引(指向數(shù)據(jù)的內(nèi)存地址)
- 堆:效率低塔猾,但是大,而且成塊(內(nèi)存連續(xù))稽坤,主要存放大數(shù)據(jù)(對象丈甸、數(shù)組、資源)
- 數(shù)據(jù)段:效率比堆高尿褪,比棧低睦擂,主要存儲普通數(shù)據(jù)
- 代碼段:將要運行的代碼加載到內(nèi)存中,然后開始執(zhí)行代碼
- 變量的內(nèi)存機制:變量在定義的過程中杖玲,在棧區(qū)有一塊索引表(PHP自動申請)顿仇,然后將變量名字存儲到表中,然后變量的值(數(shù)據(jù))存儲在數(shù)據(jù)段中,并將數(shù)據(jù)的地址存到索引表中對應(yīng)變量名的后面夺欲。也就是說跪帝,變量并不是保存數(shù)據(jù),而是保存數(shù)據(jù)所在的內(nèi)存地址些阅。訪問變量的時候,就是通過變量名找到數(shù)據(jù)地址斑唬,然后取出數(shù)據(jù)市埋。
總結(jié):PHP中的變量的存在是PHP能夠成為動態(tài)語言的一個很重要特性,能夠允許代碼對數(shù)據(jù)進行加工恕刘、判斷等缤谎,在實際開發(fā)中,應(yīng)盡量保證變量的識別度(命名與實際代表意義)褐着、變量的優(yōu)化定義(避免定義不用的變量)坷澡。變量通常是用來保存用戶有關(guān)的數(shù)據(jù)的(用戶提交的或者用戶需要的)
PHP常量【掌握】
定義:變量的好處在于可以隨時根據(jù)數(shù)據(jù)的需求改變變量所代表的數(shù)據(jù),而常量則是一開始定義并賦值后含蓉,在整個腳本執(zhí)行周期中不允許改變的量频敛,其他與變量基本一致。
1.PHP常量命名規(guī)則
- 常量名通常用大寫字母表示
- 常量名不需要使用“$”符號開始
- 常量名由字母馅扣、數(shù)字和下劃線組成斟赚,其中不能以數(shù)字開頭
- 復(fù)雜的常量名使用下劃線法表示:FAMILY_NAME
- 常量的命名比變量其實要寬松(不建議)
2.常量定義:常量的定義通常使用define函數(shù)或者const關(guān)鍵字,而且必須在定義的時候就對其賦值
<?php
//有效常量名
define('PI',3.1415926);
define('SELF_PI',3);
const FAMILY_NAME = 'Green';
define('-_-','Smile'); //寬松方式(不建議)
//錯誤常量名
define('3PI',3.14);
const 3_PI = 3;
?>
3.常量使用:常量一旦定義不能改變差油,只能在后面使用其初始化時給的數(shù)據(jù)拗军,常量直接通過常量名訪問
<?php
//訪問常量
echo PI; //訪問前面定義的常量
//特殊符號代表的常量不能用普通方式
echo -_-; //錯誤:系統(tǒng)不能識別
//所有的常量都可以使用constant函數(shù)
echo constant('-_-'); //所有常量都可以采用這種方式訪問
?>
4.系統(tǒng)常量:在系統(tǒng)中,有一些東西是程序員可能用到的蓄喇,但是又不允許程序員改變发侵,所以系統(tǒng)就定義了一些常量。
- PHP_VERSION:PHP版本號
- PHP_INT_SIZE:PHP中int數(shù)據(jù)所占用的內(nèi)存字節(jié)數(shù)
- PHP_INT_MAX:PHP中int數(shù)據(jù)所能表示的最大值
5.魔術(shù)常量:系統(tǒng)中有一些東西是在變化的妆偏,但是又是不允許隨意變化刃鳄,是有規(guī)律變化的。這個時候為了保證系統(tǒng)的健壯性楼眷,就盡量不讓用戶來進行控制铲汪。魔術(shù)常量就是其值會隨著實際環(huán)境的變化而變化,而這種變化是程序員不能控制的罐柳。
- 魔術(shù)常量使用雙下劃線開始掌腰,也使用雙下劃線結(jié)束
- __DIR__:當(dāng)前文件所在路徑(絕對路徑)
- __FILE__:當(dāng)前文件所在路徑(絕對路徑,包含文件名)
- __FUNCTION__:函數(shù)內(nèi)部使用张吉,表示函數(shù)的名字
- __CLASS__:類內(nèi)部使用齿梁,表示類名
- __NAMESPACE__:命名空間內(nèi)部使用,表示當(dāng)前所屬命名空間
- __METHOD__:類內(nèi)部方法里使用,表示當(dāng)前方法名字(所屬類)
- __LINE__:當(dāng)前所在行數(shù)
<?php
echo __DIR__; //獲取當(dāng)前PHP腳本所在路徑
echo __FILE__; //獲取當(dāng)前PHP腳本所在路徑(包含文件名)
echo __LINE__; //獲取當(dāng)前行號
echo __LINE__; //獲取當(dāng)前行號勺择,比上一行大1
?>
總結(jié):常量就是在一開始就固定數(shù)據(jù)创南,通常這些數(shù)據(jù)是不允許其他代碼去改變的,能夠保證數(shù)據(jù)的原始狀態(tài)和真實性省核。常量的定義通常是程序員為了方便程序數(shù)據(jù)的使用而定義的稿辙。
PHP數(shù)據(jù)類型【掌握】
思考:用戶有很多的數(shù)據(jù)是需要通過變量來保存的,數(shù)據(jù)到底是如何管理的呢气忠?
引入:數(shù)據(jù)的存在是復(fù)雜的邻储,系統(tǒng)會通過分門別類來進行管理,一來可以保證數(shù)據(jù)的安全性旧噪,二來可以通過數(shù)據(jù)分類來實現(xiàn)內(nèi)存的有效利用吨娜。
PHP數(shù)據(jù)分類【掌握】
定義:在PHP中,將數(shù)據(jù)根據(jù)其特定的格式和應(yīng)用歸集成對應(yīng)的類別淘钟,對每一種類別給定一種特定的名稱宦赠。
1.PHP中數(shù)據(jù)類型分為三大類八小類:
- 基本數(shù)據(jù)類型(標(biāo)量數(shù)據(jù)類型)
- 整形(int/integer):存儲整數(shù)數(shù)據(jù)
- 浮點型(float):存儲小數(shù)數(shù)據(jù)和超過整形范圍的整數(shù)數(shù)據(jù)
- 布爾型(bool/boolean):存儲布爾類型數(shù)據(jù),只有true和false兩個值
- 字符串型(string):存儲字符串?dāng)?shù)據(jù)(最常見)
- 復(fù)合數(shù)據(jù)類型
- 數(shù)組型(array):存儲數(shù)組數(shù)據(jù)(即多個數(shù)據(jù)存放到一個變量中)
- 對象型(object):存放對象數(shù)據(jù)米母,由類實例化得到(面向?qū)ο螅?/li>
- 特殊數(shù)據(jù)類型
- 資源型(resource):存儲外部資源數(shù)據(jù)(數(shù)據(jù)庫資源\文件資源)
- 空型(null):變量沒有存儲任何數(shù)據(jù)
總結(jié):PHP是一種弱類型的編程語言勾扭,因此PHP中的變量本身沒有數(shù)據(jù)類型,可以指定存放任何數(shù)據(jù)爱咬,但是對于具體要存儲的數(shù)據(jù)有數(shù)據(jù)類型之說尺借,主要是為了保證內(nèi)存的高效利用。
思考:開發(fā)需求中必然會涉及到跟數(shù)值有關(guān)的信息精拟,像年齡燎斩、商品價格等,這類數(shù)據(jù)在PHP中到底是怎么管理的呢蜂绎?
引入:PHP中對于數(shù)值管理栅表,通過兩種方式來進行管理:整數(shù)和小數(shù),而且為了支持不同的顯示需求师枣,PHP還會將數(shù)值按照特定的方式進行管理怪瓶。
數(shù)值型數(shù)據(jù)類型【掌握】
1.整型數(shù)據(jù)類型:在PHP中,整形采用8個字節(jié)存儲數(shù)據(jù)践美,根據(jù)數(shù)據(jù)需求洗贰,PHP提供了多種進制的整數(shù)存儲方式
<?php
//常見整型
$num1 = 123;
$num2 = -50;
//八進制存儲:逢8進1,使用0前綴陨倡,最大數(shù)值不超過7
$num3 = 0123;
var_dump($num3); //int(83):系統(tǒng)會自動按照十進制輸出(用戶通常不使用8進制)
//十六進制存儲:逢16進1敛滋,使用0x前綴,從10開始使用a代替兴革,依次到15使用f
$num4 = 0x123;
var_dump($num4); //int(291):系統(tǒng)轉(zhuǎn)換成10進制輸出
//二進制存儲:逢2進1绎晃,使用0b前綴(binary)
$num5 = 0b1101;
var_dump($num5); //int(13)
?>
2.進制轉(zhuǎn)換:在實際開發(fā)的時候若需要用上進制轉(zhuǎn)換的時候蜜唾,可以使用PHP提供的系統(tǒng)函數(shù)。函數(shù)的記憶是比較方便的:二進制bin庶艾,八進制oct袁余,十進制dec,十六進制hex咱揍,所以彼此的轉(zhuǎn)換分先后組合即可:如二進制轉(zhuǎn)十進制:bindec(二進制數(shù)或者字符串)颖榜,得到一個十進制結(jié)果;另外唯一一個特殊的就是二進制轉(zhuǎn)十六進制:bin2hex(二進制數(shù)或者字符串)述召。當(dāng)然朱转,進制轉(zhuǎn)換是有規(guī)則的,大家可以了解下.
3.小數(shù)型數(shù)據(jù)類型:在PHP中同樣采用8個字節(jié)存儲數(shù)據(jù)积暖,浮點數(shù)也提供了多種小數(shù)存儲方式
<?php
$f1 = 1.23;
$f2 = 1.23e3; //1.23 * 10 ^ 3
var_dump($f1,$f2); //float(1.23),float(1230)
?>
4.浮點數(shù)精度問題:浮點數(shù)與整形一樣使用8個字節(jié)存儲數(shù)據(jù),但是能夠表示的數(shù)值卻會比整形大很多怪与,原因在于浮點數(shù)64個字節(jié)并非全部用來存數(shù)值夺刑,而是有一部分存儲指數(shù)(10的N次方中的N),還有一部分用來存儲實際數(shù)值分别。造成的結(jié)果就會帶來兩個:一個是存儲的數(shù)值比整形大很多遍愿;二個是存儲的數(shù)值的精確度只能保證在13-14位之間,超過該部分就會四舍五入(丟失精度)
<?php
$num = PHP_INT_MAX; //整形最大值
$f1 = $num + 1; //超出整形范圍
var_dump($f1); //float(9.2233720368548E+18)耘斩,14個有效數(shù)字
?>
總結(jié):數(shù)值型存儲類型用來存儲整數(shù)和浮點數(shù)沼填,整數(shù)部分?jǐn)?shù)據(jù)量相對較小,但是很精確括授;浮點數(shù)部分不夠精確坞笙,但是范圍很大。因此在實際使用的時候荚虚,應(yīng)當(dāng)根據(jù)實際業(yè)務(wù)的情況來選擇使用哪種類型(當(dāng)然PHP會自動選擇薛夜,不需要用戶操心)。另外版述,浮點數(shù)因為小數(shù)和精度問題梯澜,不適合用來進行計算,只是適合大概范圍數(shù)據(jù)晚伙。
思考:在實際業(yè)務(wù)需求中,總是會碰到類似的事情喧半,用戶會根據(jù)某件事的結(jié)果來做出不同的抉擇扁耐,那么在程序中如何去保存這種Yes和No結(jié)果呢?
引入:在PHP中绷雏,對于一些抉擇類的數(shù)據(jù)膘婶,通常是采用布爾類型來進行保存垛玻,因為布爾結(jié)果只有兩種:True和false。
布爾數(shù)據(jù)類型【掌握】
1.大多數(shù)程序語言都有布爾類型:布爾類型是一種簡單的數(shù)據(jù)類型嘹黔,專門用于對某些注重結(jié)果的數(shù)據(jù)存儲账嚎,結(jié)果中只會有兩個值:True和False
<?php
$b1 = True;
$b2 = False; //在PHP中不區(qū)分大小寫
var_dump($b1,$b2); //bool(true) bool(false)
?>
總結(jié):PHP中布爾類型本身非常簡單,但是在實際開發(fā)中的應(yīng)用卻非常廣泛儡蔓,凡是在判斷的地方都是使用到布爾結(jié)果進行判定郭蕉。
思考:實際業(yè)務(wù)當(dāng)中,最常見的信息就是文字信息喂江,文字信息有長短召锈,那么在PHP中該如何實現(xiàn)存儲呢?
引入:PHP中對于“文字”是最普遍的數(shù)據(jù)获询,幾乎所有用戶提供的數(shù)據(jù)都是“文字”數(shù)據(jù)烟勋,即便是用戶填寫的數(shù)字,在最終PHP接收的時候也是當(dāng)做“文字”接收的筐付。而PHP中,使用字符串這種數(shù)據(jù)類型來保存所有的“文字”數(shù)據(jù)阻肿。
字符串?dāng)?shù)據(jù)類型【掌握】
1.在PHP中瓦戚,凡是用戶輸入的數(shù)據(jù),和程序員使用了引號(單引號和多引號)定義的數(shù)據(jù)丛塌,系統(tǒng)都理解為字符串较解。PHP7中字符串的長度理論上無限制。
<?php
$s1 = '123'; //雖然都是數(shù)字組成赴邻,但是有引號就是字符串
$s2 = "hello world";
var_dump($s1,$s2); //string(3) "123" string(11) "hello world"
?>
2.單引號和雙引號都可以定義字符串印衔,但是彼此是有區(qū)別的:
- 單引號中只能解析少量的轉(zhuǎn)義符號:',\
- 雙引號中能解析較多的轉(zhuǎn)義符號:$姥敛,"奸焙,\,\n彤敛,\t
- 雙引號中能夠解析嵌套在字符串中的PHP變量(注意變量要與其他字符串分離与帆,人工使用{})
<?php
$s1 = 'abcdegf\'\n\t\"\$';
$s2 = "abcdegf\'\n\t\"\$";
var_dump($s1); //string(16) "abcdegf'\n\t\"\$",不見的斜杠代表被轉(zhuǎn)義了
var_dump($s2); //string(13) "abcdegf\' "$"墨榄,不見的斜杠代表被轉(zhuǎn)義了
$a = '你好';
$b = '世界 $a !';
$c = "世界 $a !";
echo $b; //世界 $a 玄糟!,系統(tǒng)不能解析$a害捕,當(dāng)做普通字符串解析
echo $c; //世界 你好 蝠引!,系統(tǒng)解析了$c中的$a變量
$d = "$abc"; //錯誤:系統(tǒng)提示沒有定義變量$abc跺嗽,系統(tǒng)區(qū)分不出來
$e = "{$a}bc" //正確郭卫,系統(tǒng)理解$a是一個獨立的變量
?>
3.在PHP中砍聊,考慮到有些特殊情況下,字符串會很長箱沦,而且有格式存在辩恼。所以PHP針對單引號和雙引號還做了一層擴展:nowdoc結(jié)構(gòu)(單引號)和heredoc結(jié)構(gòu)(雙引號)
- nowdoc是類似單引號功能
- heredoc是類似雙引號功能
- nowdoc和heredoc在內(nèi)部的所有內(nèi)容都是屬于字符串本身(不能寫注釋)
- nowdoc和heredoc開始符號后不能有任何內(nèi)容
- nowdoc和heredoc結(jié)束符號必須頂格,且后面除了語句結(jié)束符不能有任何內(nèi)容
<?php
$wish = '世界和平';
//nowdoc
$n = <<<'END'
我的愿望是:$wish
END;
echo $n; //我的愿望是:$wish
//heredoc:注意谓形,符號END并不是規(guī)定的灶伊,可以自己取,但是通常不建議改(怕關(guān)鍵字)
$h = <<<END
我的愿望是:$wish
END;
echo $h; //我的愿望是:世界和平
?>
4.字符串查看:日常字符串通常直接輸出操作即可寒跳。PHP中字符串其實每個字符都有一個下標(biāo)聘萨,可以通過下標(biāo)(數(shù)組訪問方式)來對字符串中的具體位置字符進行訪問。PHP中的下標(biāo)都是從0開始童太。
<?php
$str = 'hello world';
echo $str[0]; //h:第一個字母
echo $str[-1]; //d:倒數(shù)第一個字母米辐,負(fù)數(shù)從后面開始,-1代表倒數(shù)第一個
?>
總結(jié):字符串型是日常開發(fā)中所見到的最常見的一種數(shù)據(jù)類型书释,其中關(guān)鍵注意點就是單雙引號字符串的區(qū)別翘贮,以及雙引號中解析PHP變量的使用,在實際開發(fā)中經(jīng)常用爆惧。
思考:在業(yè)務(wù)需求中狸页,經(jīng)常會出現(xiàn)這樣的問題:一個用戶通常會有許多信息需要展示,這個時候是不是用很多的變量來解決這個問題呢扯再?如果是很多用戶呢芍耘?
引入:程序中,為了解決某些系列數(shù)據(jù)問題熄阻,通常會用一個變量來保存所有信息斋竞,這樣能夠保證數(shù)據(jù)在進行解析和展示的時候更有層次感,也更方便秃殉。
PHP數(shù)組【掌握】
定義:數(shù)組即數(shù)據(jù)的組合坝初,是指將一系列相關(guān)或者相似的數(shù)據(jù),組合到一起复濒,使用一個變量代表脖卖。在數(shù)組中,可以有多個數(shù)據(jù)巧颈,每個數(shù)據(jù)稱之為一個元素畦木,元素與元素之間使用英文逗號“,”分隔。元素的組成有兩部分:下標(biāo)(key)和值(value)砸泛。
1.定義數(shù)組:在PHP中可以通過多種方式來定義數(shù)組十籍,通用的幾種方式如下:
- 使用array關(guān)鍵字來初始化數(shù)組
- 使用數(shù)組括號[]來初始化數(shù)組
- 使用變量跟[]來初始化數(shù)組蛆封,但是這個時候需要給定一個值,而且一次只能增加一個元素
<?php
//使用array關(guān)鍵字定義數(shù)組
$arr1 = array(); //可以不指定元素勾栗,也可以在括號中增加元素
$arr2 = array('name','age');
//使用[]定義數(shù)組
$arr3 = [];
$arr4 = ['name','age'];
//針對變量增加元素方式定義數(shù)組
$arr4[] = 'name';
?>
2.PHP中數(shù)組的使用:PHP中數(shù)組的訪問其實就是訪問數(shù)組中的某個元素值惨篱,訪問方式必須通過數(shù)組下標(biāo)進行訪問。默認(rèn)的數(shù)組元素的下標(biāo)是不可見的围俘,根據(jù)元素的順序從0開始砸讳。
<?php
$arr = ['name','age']; //實際上[0 => 'name',1 => 'age']
//訪問name值
echo $arr[0];
?>
3.PHP中數(shù)組的特點
- PHP數(shù)組中的元素沒有數(shù)量限制,即數(shù)組不限定長度
- PHP中數(shù)組可以動態(tài)增加元素
- PHP中數(shù)組元素的值可以是任意數(shù)據(jù)類型
- PHP中數(shù)組下標(biāo)可以是純數(shù)字(索引數(shù)組)界牡、純字符串(關(guān)聯(lián)數(shù)組)和混合數(shù)字和字符串(混合數(shù)組)
<?php
//索引數(shù)組
$arr1 = array(1,2,3,4,5);
//關(guān)聯(lián)數(shù)組
$arr2 = array('name' => '張三','age' => 30,'gender' => '男');
//混合數(shù)組
$arr3 = array(1,2,'name' => '張三','age' => 30);
//訪問:一樣簿寂,使用下標(biāo)訪問
echo $arr1[1]; //2
echo $arr2['name']; //張三
?>
4.二維數(shù)組:普通數(shù)組基本都是一維數(shù)組,即數(shù)組里面的元素全部都是一維的(普通數(shù)據(jù))宿亡,但是有的時候常遂,尤其是在大數(shù)據(jù)處理的情況下,通常都會存在數(shù)組元素本身也是數(shù)組的情況挽荠。我們把數(shù)組元素都是一維數(shù)組的數(shù)組稱之為二維數(shù)組克胳。另外,理論上來將圈匆,PHP中數(shù)組沒有限定數(shù)組到底可以多少層嵌套(多維數(shù)組)漠另,但是建議數(shù)組的層級不要超過三維。
<?php
$user1 = array('name' => '張三',age => 30);
$user2 = array('name' => '李四',age => 23);
$user3 = array('name' => '王五',age => 40); //一維數(shù)組
//二維數(shù)組
$users = array($user1,$user2,$user3);
//二維數(shù)組訪問:先通過一維下標(biāo)找到對應(yīng)的數(shù)組元素跃赚,然后用二維下標(biāo)讀取元素值
//獲取張三的年齡
echo $users[0]['age']; //$users[0]的結(jié)果是$user1酗钞,然后組合$user1['age'],從而最終獲得張三的年齡
?>
總結(jié):在PHP中數(shù)組的使用頻率非常高来累,在結(jié)合數(shù)據(jù)庫操作之后,通常都是關(guān)聯(lián)數(shù)組窘奏,而且在數(shù)據(jù)展示的時候二維數(shù)組居多(第一維索引嘹锁,第二維關(guān)聯(lián)),所以數(shù)組在程序開發(fā)當(dāng)中使用的非常普遍着裹,也是數(shù)據(jù)類型中比較復(fù)雜的一種领猾。
思考:有這么多數(shù)據(jù)類型,在應(yīng)用的時候如果確定需要某種指定的數(shù)據(jù)類型骇扇,如計算的時候需要數(shù)據(jù)是數(shù)值摔竿,到底如何確認(rèn)數(shù)據(jù)是否滿足呢?
引入:在PHP中少孝,提供了一系列的數(shù)據(jù)判斷函數(shù)继低,能夠?qū)?shù)據(jù)進行格式判定,可以給程序員提供判定結(jié)果稍走,以供參考袁翁。
類型判斷【掌握】
定義:類型判定是系統(tǒng)通過指定函數(shù)來確定數(shù)據(jù)的類別柴底,給定判定結(jié)果,結(jié)果為布爾值粱胜,是對應(yīng)類型返回true柄驻,不是返回false。
1.通過系統(tǒng)函數(shù)判定數(shù)據(jù)類型:函數(shù)的格式很好記焙压,使用is_開頭鸿脓,后面跟對應(yīng)的數(shù)據(jù)類型,可以通過操作手冊is_進行搜索查詢(PHP操作手冊.chm->索引->輸入is_)涯曲,以下講幾個常用的判定函數(shù)
<?php
$num = 100;
$str = '100';
//數(shù)值
$res = is_numeric($str);
var_dump($res); //bool(true)野哭,is_numeric是用來判定數(shù)據(jù)是否是數(shù)值或者純數(shù)值的字符串
var_dump(is_scalar($num)); //bool(true),is_scalar是用來判定數(shù)據(jù)是否是標(biāo)量(基本數(shù)據(jù)類型)
var_dump(is_null($num)); //bool(false)掀抹,is_null是用來判定數(shù)據(jù)是否為NULL
?>
總結(jié):數(shù)據(jù)類型判定在實際開發(fā)中有著非常重要的地位虐拓,因為作為后臺語言,要與用戶進行交互傲武,要時刻警惕用戶提交的數(shù)據(jù)是否滿足需求蓉驹,必要時還要確保用戶是否存在惡意操作。在實際開發(fā)中揪利,要特別記住一句話:不要相信任何外來數(shù)據(jù)态兴。
思考:數(shù)據(jù)類型可以判定用戶的數(shù)據(jù)是否滿足格式,但是如果碰到需要特定的數(shù)據(jù)的時候疟位,而給定的數(shù)據(jù)是有效數(shù)據(jù)但是卻不符合類型要求時怎么辦呢瞻润?
引入:在實際開發(fā)中,這類問題會經(jīng)常碰到甜刻,尤其是進行有效性判定的時候绍撞,給定的數(shù)據(jù)通常不是目標(biāo)數(shù)據(jù)類型,那么這個時候就需要對數(shù)據(jù)本身進行類型轉(zhuǎn)換得院。
類型轉(zhuǎn)換【掌握】
定義:PHP中需要將一些不同的類型轉(zhuǎn)換成某個指定數(shù)據(jù)類型才能進行相關(guān)運算傻铣,這種轉(zhuǎn)換操作叫做類型轉(zhuǎn)換。PHP是一種弱類型語言祥绞,所以在PHP中有兩種類型轉(zhuǎn)換方式:自動轉(zhuǎn)換和強制轉(zhuǎn)換非洲。
1.自動轉(zhuǎn)換:就是PHP會自動根據(jù)數(shù)據(jù)要參與的運算場景來將不符合條件的數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換成目標(biāo)類型數(shù)據(jù),這種操作在PHP代碼中絕大多數(shù)時候可以滿足開發(fā)需求蜕径。
<?php
$num = 5;
$str = '1.2a35';
echo $num + $str; //6.2两踏,當(dāng)前運算為算術(shù)運算,所以系統(tǒng)判定數(shù)據(jù)要求為數(shù)值兜喻,自動將字符串轉(zhuǎn)換成數(shù)值參與運算
//字符串轉(zhuǎn)換成數(shù)值規(guī)則
1.第一個字符是字母或者其他特殊符號梦染,結(jié)果為0
2.第一個字符是數(shù)字,可以依次往后保留朴皆,直到不是數(shù)字為止
3.如果在數(shù)字往后推的情況下弓坞,碰到第二個小數(shù)點結(jié)束(保留一個小數(shù)點)
?>
2.強制轉(zhuǎn)換:在程序員開發(fā)過程中某個特定節(jié)點下隧甚,需要對數(shù)據(jù)進行最終格式確定,這個時候可以對數(shù)據(jù)進行強制轉(zhuǎn)換渡冻。轉(zhuǎn)換方式是在數(shù)據(jù)變量前使用(目標(biāo)數(shù)據(jù)類型)戚扳。
<?php
$str = '1.2.3.4.3abc';
//強制轉(zhuǎn)換成數(shù)值
echo (float)$str; //1.2
?>
總結(jié):總體而言,因為PHP的若類型族吻,所以絕大部分時候PHP中需要轉(zhuǎn)換的時候都會由系統(tǒng)自動完成帽借,但是也會有某些情況下需要使用到強制轉(zhuǎn)換(安全、明確)超歌。合理的使用的數(shù)據(jù)類型的轉(zhuǎn)換砍艾,能夠幫助我們的代碼更加健壯,安全巍举。
PHP運算符【掌握】
思考:常量的數(shù)據(jù)是程序員為了程序運行定義的必要數(shù)據(jù)脆荷,變量保存的這些臨時數(shù)據(jù)有什么用?
引入:變量通常保存的是用戶數(shù)據(jù)懊悯,而用戶的數(shù)據(jù)通常是需要通過各種運算才能滿足存儲或者給用戶展示的形態(tài)蜓谋。
PHP運算符了解【掌握】
1.定義:運算符是系統(tǒng)定義的特殊的符號,PHP解釋器在碰到各種符號時炭分,就會按照預(yù)定的方式來實現(xiàn)某些運算桃焕。
2.在PHP中,運算符很多捧毛,分為以下幾類:
- 賦值運算符【掌握】
- 給變量或者常量進行賦值運算:把右邊的結(jié)果保存到左邊
- =:最常見的賦值運算
- +=:左邊與右邊的運算結(jié)果(整體)相加观堂,然后再把整個運算結(jié)果賦值給左邊
- -=|*=|/=:與+=一致
- .=:“.”為字符串連接操作符,表示左邊的字符串與右邊的字符串連起來后賦值給左邊變量
- 注意:在使用“/=”進行運算的時候呀忧,右側(cè)的結(jié)果不能為0师痕,否則會報錯
<?php
//簡單賦值
$num1 = 10;
//復(fù)合操作
$num1 += 10;
//等價于以下操作
$num1 = $num1 + 10; //注意位置:是等價于變量在右側(cè)表達(dá)式的最左邊
//優(yōu)先級操作
$num2 = 10;
$num2 *= 1 + 1;
//等價操作
$num2 = $num2 * (1 + 1); //注意該操作是左側(cè)變量與右側(cè)整體結(jié)果做操作
//注意事項
$num2 /= 0; //錯誤
//等價操作
$num2 = $num2 / 0; //除數(shù)不能為0
?>
- 算術(shù)運算符【掌握】
- 普通算術(shù)運算,需要符號左右兩邊都是數(shù)值
- +:加法運算而账,左右兩邊相加
- -:減分運算七兜,左邊減去右邊
- *:乘法運算,左邊乘以右邊
- /:除法運算福扬,左邊除以右邊(右邊不能為0)
- %:取余運算(模運算),左邊除以右邊惜犀,不能整除部分的余數(shù)
<?php
//基本運算
$a = 10;
$b = 8;
//加減乘除取余基本運算
$c = $a + $b; //$c = 10 + 8 = 18
$d = $a / $b; //$d = 10 / 8 = 1.25
$e = $a % $b; //$e = 10 % 8 = 2(余2不能整除)
//注意事項
$f = $a / 0; //錯誤:除數(shù)不能為0
$g = $a % 0; //錯誤:除數(shù)不能為0
?>
- 錯誤抑制符【掌握】
- 單目運算铛碑,將可能出現(xiàn)的比較低級的錯誤給抑制,不報錯誤
- @:在可能出現(xiàn)錯誤的表達(dá)式之前使用
<?php
/*錯誤抑制是一種代碼的保護機制虽界,為了不讓用戶看到錯誤汽烦,因為用戶不明白錯誤是什么原因。更多的時候莉御,程序員應(yīng)該將所有錯誤都預(yù)估并且通過代碼控制屏蔽掉可能出現(xiàn)的錯誤撇吞,但是有些錯誤的出現(xiàn)可能是不可避免的俗冻,這個時候就需要使用到錯誤抑制,增強用戶友好性*/
$a = 10 / 0; //程序直接報錯牍颈,非常專業(yè)錯誤
@$a = 10 / 0; //系統(tǒng)依然錯誤迄薄,但是不會報錯給用戶
?>
- 比較運算符【掌握】
- 用于兩個表達(dá)式的比較,比較的結(jié)果通常是true或者false
- >:左邊大于右邊返回true煮岁,否則返回false
- <:左邊小于右邊返回true讥蔽,否則返回false
- >=:左邊大于或者等于右邊返回true,否則返回false
- <=:左邊小于或者等于右邊返回true画机,否則返回false
- ==:左邊等于右邊返回true冶伞,否則返回false
- ===:左邊等于右邊,且兩邊數(shù)據(jù)類型一致返回true步氏,否則返回false
<?php
$a = 10; //數(shù)字10
$b = 5;
$c = '10'; //字符串10
//基本比較運算
$res = $a > $b;
var_dump($res); //布爾true:10 > 5响禽,成立
//全等運算
$res = ($a == $c);
var_dump($res); //布爾true:10 與 '10'系統(tǒng)自動會轉(zhuǎn)換成相同的格式比較,都是10荚醒,所以相等
$res = ($a === $c);
var_dump($res); //布爾false:10與10值相同芋类,但是10是數(shù)字,'10'是字符串腌且,類型不同
?>
在PHP中比較運算比較特殊梗肝,通常系統(tǒng)會自動將類型轉(zhuǎn)換成相同的然后進行比較,所以大家在使用==和===比較的時候铺董,如果自己不夠明確可以參照PHP操作手冊中的類型比較表:PHP操作手冊->附錄->PHP類型比較表巫击。
松散比較
嚴(yán)格比較
- 飛船運算符(PHP7)【掌握】
- 飛船運算,類似組合比較運算中的大于精续、等于和小于三種運算符于一身
- <=>:飛船運算坝锰,左邊大于右邊返回1,等于右邊返回0重付,小于右邊返回-1
<?php
$a = 5;
$b = 3;
$c = '5';
var_dump($a <=> $b); //1:因為 5 > 3
var_dump($a <=> $c); //0:因為 5 == '5'
?>
- 合并運算符(PHP7)【掌握】
- 用于數(shù)據(jù)判斷取值操作
- ??:左邊表示要判定的表達(dá)式顷级,右邊表示判定不成功的默認(rèn)結(jié)果
<?php
//很多時候,用戶提交數(shù)據(jù)中會有一些選填部分确垫,用戶可以不填代表使用默認(rèn)值
$gender = $_GET['gender'] ?? 'Male';
//表示:如果用戶提交的gender信息弓颈,那么$gender就保存用戶信息;如果沒有提交删掀,那么默認(rèn)使用Male作為$gender的值
echo $gender; //當(dāng)前沒有提交的概念也就是$_GET['gender']不存在翔冀,所以值是Male
?>
- 邏輯運算符【掌握】
- 用于針對運算結(jié)果進行運算
- &&:邏輯與運算(也作and),左右兩邊結(jié)果都為true返回true披泪,否則返回false
- ||:邏輯或運算(也作or)纤子,左右兩邊結(jié)果至少有一個true返回true,否則返回false
- !:邏輯非運算,原來結(jié)果為true返回false控硼,原來結(jié)果為false返回true
- 邏輯運算符(邏輯與和邏輯或)也稱之為短路運算符:即左邊表達(dá)式如果已經(jīng)能夠確定結(jié)果泽论,那么右邊表達(dá)式就不再判定
<?php
$gender = '男';
$age = 18;
//判斷人員已成年
if($gender == '男' && $age >= 18){
//必須同時滿足性別為男,同時年齡達(dá)到18周歲
echo '已成年';
}
//短路運算
true || $a = 10; //邏輯或運算卡乾,一個為true翼悴,整個為true,現(xiàn)在左邊已經(jīng)是true说订,那么右邊不會運算
echo $a; //18抄瓦,沒有被修改,說明上述運算短路了
?>
- 連接運算符【掌握】
- 用于PHP中的字符串運算
- .:將左右兩邊的字符串連接成一個
<?php
$a = 'hello';
$b = 'world';
//組合hello world
$c = $a . ' ' . $b;
echo $c; //hello world
?>
- 三目運算符【掌握】
- 三個表達(dá)式組成的一個運算表達(dá)式
- 表達(dá)式1 ? 表達(dá)式2 :表達(dá)式3
- 如果表達(dá)式1成立陶冷,整個結(jié)果為表達(dá)式2钙姊;否則為表達(dá)式3
<?php
$age = 18;
//確定用戶是否已經(jīng)成年
$man = $age >= 18 ? '成年' : '未成年';
echo $man; //成年
?>
- 自操作運算符【掌握】
- 自動操作的運算方式
- ++/--:自增/自減,在原來的值上加1/減1
- 前置自操作:先自我運算埂伦,然后把最終自己的結(jié)果給其他運算
- 后置自操作:先把自己的結(jié)果給其他運算煞额,然后自我運算
<?php
$age = 18;
//年齡每年都會增長
$age++;
echo $age; //19
//后置++:$age已經(jīng)19
echo $age++; //19:因為后置是先把原來的值給其他運算(echo),后自增長
echo $age; //20
//前置++:$age已經(jīng)20
echo ++$age; //21:因為前置++是先自己改變沾谜,然后把結(jié)果給其他運算(echo)
echo $age; //21
?>
-
位運算符【了解】
- 計算機層最簡單的運算方式膊毁,直接對計算機的存儲單元“位(bit)”進行運算
- 計算機碼:計算機內(nèi)部實際數(shù)值存儲機制
- &:按位與運算,兩位都為1結(jié)果為1基跑,否則為0
- |:按位或運算婚温,兩位有1位為1,結(jié)果為1媳否,否則為0
- ^:按位異或:兩位不同則為1栅螟,相同則為0
- ~:按位取反:1位運算,本身為1結(jié)果為0篱竭,本身為0結(jié)果為1
- <<:按位左移,將全部位向左移動,右邊補0
- >>:按位右移,將全部位向右移動,左邊補符號位
- 關(guān)于位運算力图,首先大家必須了解計算機中的整數(shù)的存儲機制:PHP中整數(shù)是用8個字節(jié)存儲,一個字節(jié)對應(yīng)8個基準(zhǔn)位(位的值只有0和1)掺逼,一共64位吃媒。而PHP中對應(yīng)的整數(shù)是有符號類型(即有正負(fù)),左邊第一位代表符號為吕喘,0代表正數(shù)赘那,1代表負(fù)數(shù)。即00000000 ... 00000001為正1氯质,10000000 ... 00000001理論為負(fù)1.
- 因為上述理論存在募舟,那么系統(tǒng)中會存在+0和-0的情況:0000...0000代表+0,1000...0000代表-0病梢,這樣的結(jié)果在系統(tǒng)中是浪費的,所以計算機為了解決這一問題設(shè)計了一套計算機碼:即計算機中正負(fù)數(shù)的存在形式。
- 計算機碼分為原碼蜓陌、反碼和補碼觅彰,原碼就是十進制的數(shù)(絕對值)轉(zhuǎn)換成的二進制,如-5的原碼是00000101钮热,反碼則是在原碼基礎(chǔ)上符號位不變填抬,其他位取反(0變1,1變0),那么5的反碼就是11111010隧期,補碼則在反碼基礎(chǔ)上+1飒责,所以-5的補碼是:11111011,這便是系統(tǒng)最終存儲的結(jié)果仆潮。
- 正數(shù)的原碼宏蛉、反碼和補碼就是原碼不變,而負(fù)數(shù)以補碼的形式存儲
- 負(fù)數(shù)最終顯示給用戶的結(jié)果就是將補碼-1性置,變成反碼拾并,然后取反(符號位不變),變成原碼
- 因此鹏浅,計算機中能表示的最大正數(shù)為01111111 ... 11111111嗅义,即2^63 - 1
- 用戶看到的結(jié)果都是原碼轉(zhuǎn)換的結(jié)果,系統(tǒng)存儲的才是補碼
- 測算:-0隐砸,原碼為:10000000 ... 00000000之碗,反碼為:11111111 ... 11111111,加1變補碼為:00000000 ... 00000000(溢出最高位為0)季希,最終與+0的存儲碼一致褪那,因為在人看來+0和-0沒有任何區(qū)別。
<?php
$a = 5;
$b = 3;
//按位與
echo $a & $b;
//00000000 ... 00000101
//00000000 ... 00000011
//00000000 ... 00000001 //最終結(jié)果:1
//按位或
echo $a | $b;
//00000000 ... 00000101
//00000000 ... 00000011
//00000000 ... 00000111 //最終結(jié)果:7
//按位異或
echo $a ^ $b;
//00000000 ... 00000101
//00000000 ... 00000011
//00000000 ... 00000110 //最終結(jié)果:6
//按位取反
echo ~$a;
//00000000 ... 00000101
//11111111 ... 11111010 //注意:這是異或后的結(jié)果:符號位為1胖眷,表示你負(fù)數(shù)(系統(tǒng)為補碼)武通,所以要輸出的話要轉(zhuǎn)化成原碼
//11111111 ... 11111001 //反碼:補碼-1
//10000000 000 00000110 //原碼:符號位不變,其他位取反珊搀,最終結(jié)果-6
//按位左移和右移
echo $a << 1;
//00000000 ... 00000101
//00000000 ... 00001010 //最終結(jié)果:10
echo $a >> 1;
//00000000 ... 00000101
//00000000 ... 00000010 //最終結(jié)果:2
//在不使用第三方變量的情況下冶忱,交換兩個變量的值
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,$b; //35,實現(xiàn)交換
?>
3.運算符優(yōu)先級:很多運算的時候都是同時使用好多個運算符號境析,那么此時就會有誰先算和誰后算的問題(如乘除同級但是高于加減)囚枪,在PHP中運算符號也有優(yōu)先級規(guī)定,具體可以參照PHP操作手冊->語言參考->運算符->運算符優(yōu)先級
總結(jié):PHP中運算符有很多劳淆,絕大部分都是經(jīng)常要使用的链沼。在PHP中會經(jīng)常碰到數(shù)據(jù)運算,所以對于運算符的掌握是一種基礎(chǔ)要求沛鸵。