* 【goto】5.3+ 版本 */
用來跳轉(zhuǎn)到程序中的某一指定位置
該目標(biāo)位置可以用目標(biāo)名稱?加上冒號(hào)來標(biāo)記。
PHP中的goto有一定限制灰蛙,只能在同一個(gè)文件和作用域中跳轉(zhuǎn)祟剔,
也就是說你無法跳出一個(gè)函數(shù)或類方法,也無法跳入到另一個(gè)函數(shù)摩梧。
你也無法跳入到任何循環(huán)或者switch結(jié)構(gòu)中物延。
常見的用法是用來跳出循環(huán)或者switch,可以代替多層的break仅父。
可以從循環(huán)(switch)中跳出來教届,但不能從外部跳轉(zhuǎn)進(jìn)去。而函數(shù)或類方法驾霜,向外向內(nèi)均不可。
goto?a;
echo?'Foo';
a:
echo?'Bar';
/*?【文件加載】?*/
require?/?include?/?require_once?/?include_once
文件載入只是載入目標(biāo)文件內(nèi)的代碼并執(zhí)行买置,與載入的文件類型無關(guān)
文件載入屬于執(zhí)行階段粪糙,當(dāng)執(zhí)行到require等語句時(shí),才載入該文件的代碼忿项,
編譯并執(zhí)行蓉冈,然后回到require等語句位置繼續(xù)執(zhí)行下面的語句
【注意】
在載入開始時(shí),先退出PHP模式轩触;
再載入目標(biāo)文件代碼寞酿,執(zhí)行該代碼;
結(jié)束時(shí)脱柱,再進(jìn)入PHP模式伐弹。
require:處理失敗,產(chǎn)生?E_COMPILE_ERROR?錯(cuò)誤榨为,腳本中止惨好。
include:處理失敗煌茴,產(chǎn)生?E_WARNING?錯(cuò)誤,腳本繼續(xù)執(zhí)行日川。
#不建議使用require_once/include_once
/*?【相對(duì)路徑】?*/
當(dāng)前瀏覽器請(qǐng)求的哪個(gè)腳本蔓腐,當(dāng)前位置就是屬于哪個(gè)腳本。
./file?和?file?都表示當(dāng)前目錄下的file文件
file情況(嵌套載入文件時(shí)):
如果當(dāng)前目錄沒找到該文件就在代碼文件所在目錄中繼續(xù)找龄句。
如果當(dāng)前目錄找到有該文件回论,則不會(huì)再在代碼文件所在目錄去找也不會(huì)再加載。
__DIR__?????腳本文件所在目錄
__FILE__????腳本文件路徑
include_path????加載文件查找目錄
set_include_path()??設(shè)置include_path分歇,可多個(gè)傀蓉,用字符串作參數(shù)
該函數(shù)設(shè)置的path只針對(duì)該當(dāng)前文件有效
該設(shè)置只針對(duì)查找未直接寫文件路徑方式有效
設(shè)置新的include_path會(huì)覆蓋原來的
get_include_path()??獲取當(dāng)前include_path設(shè)置項(xiàng),無參數(shù)
路徑分隔符卿樱,在Windows下是分號(hào)僚害,在Linux下是冒號(hào)
利用預(yù)定義常量?PATH_SEPARATOR?來獲得當(dāng)前的分隔符
如果直接寫文件名:
1.?include_path所設(shè)置的
2.?當(dāng)前目錄
3.?代碼所在文件的目錄
如果文件名前帶有路徑,則會(huì)直接根據(jù)路徑查找繁调,include_path直接被忽略
/*?【return】?*/
return與require結(jié)合萨蚕,可返回文件的內(nèi)容,return寫在被載入的文件內(nèi)
return可以終止所在腳本的執(zhí)行蹄胰,作為普通腳本語句
return可以返回函數(shù)的相應(yīng)值
/*?【終止和延遲腳本執(zhí)行】?*/
die?/?exit???終止
return是終止所在腳本的執(zhí)行
die和exit會(huì)立即終止腳本執(zhí)行
die("到此為止");?????該函數(shù)內(nèi)的字符串可被輸出
sleep()??延遲(單位:秒)
默認(rèn)最多可延遲30秒岳遥,PHP配置可以修改?max_execution_time
例:sleep(12);
usleep()????以指定的微秒數(shù)延遲執(zhí)行
time_sleep_until????使腳本睡眠到指定的時(shí)間為止
/*?【函數(shù)】?*/
1.?函數(shù)的聲明是在編譯時(shí),故先定義再調(diào)用裕寨,定義與調(diào)用無先后關(guān)系浩蓉!
2.?文件只是代碼的載體,程序均在內(nèi)存中執(zhí)行宾袜!
3.?如果函數(shù)的定義在需要載入的文件內(nèi)捻艳,則需要先載入該文件,否則調(diào)用出錯(cuò)庆猫!
4.?函數(shù)的定義可以出現(xiàn)在其他的代碼段中认轨,此時(shí)函數(shù)不會(huì)在編譯階段被執(zhí)行
只有被執(zhí)行到時(shí)才會(huì)被定義!只有獨(dú)立定義時(shí)才會(huì)被編譯在內(nèi)存中月培!
如果出現(xiàn)在其他函數(shù)體內(nèi)嘁字,也需要外層函數(shù)被調(diào)用時(shí)才被定義并生效!
5.?函數(shù)名不區(qū)分大小寫
6.?不允許重名杉畜,包括系統(tǒng)函數(shù)
7.?【可變函數(shù)】
函數(shù)名可以用其他變量代替
$func_name?=?"sayHello";
$func_name();???????//此時(shí)調(diào)用sayHello()函數(shù)
注意:只有在調(diào)用時(shí)才能使用變量纪蜒,定義時(shí)不允許!
8.?變量可作為函數(shù)名調(diào)用函數(shù)此叠,數(shù)組元素值也可以纯续!
9.?形式參數(shù)parameter,實(shí)際參數(shù)argument
可以對(duì)參數(shù)傳遞?null,表示該形參不想傳遞值
形參與實(shí)參之間既可值傳遞杆烁,也可引用傳遞牙丽。
引用傳遞參數(shù),應(yīng)該在定義函數(shù)時(shí)就在形式參數(shù)前加上?&?符號(hào)兔魂,而此時(shí)調(diào)用函數(shù)實(shí)參必須為變量
如何選擇使用哪種傳遞方式烤芦?
a.?是否需要保證原始數(shù)據(jù)的完整性
b.?是否需要增加效率
c.?對(duì)大數(shù)據(jù)引用傳遞可節(jié)省內(nèi)存
10.?參數(shù)默認(rèn)值
a.?函數(shù)的參數(shù)默認(rèn)值必須是已經(jīng)確定的值,不能是變量析校!
只要在調(diào)用之前定義該常量构罗,則可以使用常量作為參數(shù)默認(rèn)值
b.?函數(shù)默認(rèn)值可以有多個(gè),建議將有默認(rèn)值的參數(shù)放在參數(shù)列表的最后面
這樣可以在調(diào)用函數(shù)時(shí)智玻,不賦予后面有默認(rèn)值的參數(shù)值遂唧,否則會(huì)出錯(cuò)
c.?默認(rèn)參數(shù)可以是非標(biāo)量類型,比如數(shù)組吊奢、null
d.?任何默認(rèn)參數(shù)必須放在任何非默認(rèn)參數(shù)的右側(cè)
11.?參數(shù)數(shù)量
a.?形參數(shù)量多于實(shí)參數(shù)量
報(bào)告警告級(jí)別錯(cuò)誤盖彭,并以NULL代替
b.?實(shí)參多于形參
不報(bào)告錯(cuò)誤,依次為形參賦值
c.?不確定參數(shù)數(shù)量
1)?一個(gè)形參都不定義页滚,永遠(yuǎn)都是實(shí)參多于形參
2)?【可變數(shù)量參數(shù)】
func_get_args()?獲取當(dāng)前函數(shù)被調(diào)用時(shí)所有實(shí)參的值召边,返回一個(gè)所有實(shí)參值組成的數(shù)組
func_get_arg()??獲取某個(gè)實(shí)參的值,通過索引值標(biāo)識(shí)裹驰,e.g:?func_get_arg(0)
func_num_args()?獲取所有實(shí)參的數(shù)量
12.?【return】返回值
a.?函數(shù)只有一個(gè)返回值隧熙,可以通過返回一個(gè)數(shù)組來得到類似的結(jié)果,但可以有多條return語句
b.?return語句會(huì)立即中止函數(shù)的運(yùn)行幻林,并將控制權(quán)交回調(diào)用該函數(shù)的代碼行
c.?可以返回包括數(shù)組和對(duì)象的任意類型
d.?函數(shù)的返回也分值傳遞和引用傳遞(返回的是一個(gè)變量才可)
1)?默認(rèn)是值傳遞方式
2)?引用傳遞方式:
-?定義函數(shù)時(shí)贞盯,函數(shù)名前加上&?表示該函數(shù)可以返回引用
-?調(diào)用函數(shù)時(shí),函數(shù)名前加上&?表示取得函數(shù)返回的引用
此時(shí)沪饺,函數(shù)外修改返回值躏敢,會(huì)修改函數(shù)內(nèi)的該返回變量的值
-?如果函數(shù)需返回引用,則需要返回一個(gè)變量才可以
-?從函數(shù)返回一個(gè)引用整葡,必須在函數(shù)聲明和指派返回值給一個(gè)變量時(shí)都使用引用操作符&
function?&returns_reference(){return?$someref;}
$newref?=&?returns_reference();
3)?返回引用的作用
/*?【變量作用域】?*/
a.?全局變量和局部變量
1)?作用域之間不重疊件余,即不同作用域的變量,之間不可訪問
2)?全局作用域??-?函數(shù)之外的區(qū)域
3)?局部作用域??-?函數(shù)內(nèi)的區(qū)域掘宪,每個(gè)函數(shù)都是一個(gè)獨(dú)立的作用域
b.?超全局變量,既可以在全局也可在局部使用攘烛,僅能用系統(tǒng)自帶的魏滚,均是數(shù)組變量。
$GLOBALS????$_COOKIE????$_ENV???????$_FILES?$_GET
$_POST??????$_REQUEST???$_SERVER????$_SESSION
c.?$GLOBALS
1)?不能存在超全局變量坟漱,但可以有超全局的數(shù)據(jù)鼠次!
2)?將需要的數(shù)據(jù)放到超全局變量的數(shù)組內(nèi),但統(tǒng)一使用$GLOBALS
3)?$GLOBALS?特征
-?每個(gè)全局變量就是對(duì)應(yīng)$GLOBALS內(nèi)的一個(gè)元素!
每當(dāng)增加一個(gè)全局腥寇,則自動(dòng)在$GLOBALS內(nèi)增加一個(gè)同名元素成翩!
同理,每當(dāng)增加元素赦役,也會(huì)增加一個(gè)全局變量麻敌,一般在函數(shù)內(nèi)增加
-?做的任何修改,也會(huì)映射到另一個(gè)掂摔,包括更新和刪除
在函數(shù)內(nèi)訪問全局變量术羔,只需使用$GLOBALS
-?出現(xiàn)過的全局變量,就可以通過$GLOBALS這個(gè)數(shù)組取得
4)?PHP生命周期中乙漓,定義在函數(shù)體外部的所謂全局變量级历,函數(shù)內(nèi)部是不能直接獲得的
4)?global關(guān)鍵字(不建議使用)
將局部變量聲明為同名全局變量的一個(gè)'引用'!相當(dāng)于常量的引用傳遞
global?$var;????//?$var?=?&$GLOBALS['var'];
不同于$GLOBALS0扰A戎场!
global在函數(shù)產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量涩蜘,而不是真正的函數(shù)外部變量嚼贡。
$GLOBALS確確實(shí)實(shí)調(diào)用是外部的變量,函數(shù)內(nèi)外會(huì)始終保持一致皱坛。
global的作用是定義全局變量编曼,但是這個(gè)全局變量不是應(yīng)用于整個(gè)網(wǎng)站,而是應(yīng)用于當(dāng)前頁面剩辟,包括include或require的所有文件掐场。
d.
1)?作用域只針對(duì)變量,對(duì)常量無效
2)?被載入文件中定義的變量作用域取決于被載入的位置贩猎。
函數(shù)外被載入就是全局熊户,函數(shù)內(nèi)被載入就是局部!
/*?【變量生命周期】?*/
1.?腳本結(jié)束時(shí)吭服,全局變量消失
2.?函數(shù)執(zhí)行完時(shí)兵拢,局部變量消失
3.?靜態(tài)變量
static關(guān)鍵字
靜態(tài)變量僅在局部函數(shù)域中存在鹏倘,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不丟失。
靜態(tài)變量僅會(huì)被初始化一次窒篱,其他局部變量每次被調(diào)用時(shí)都會(huì)被重新賦值。
static聲明的靜態(tài)變量的生命周期會(huì)被一直延續(xù)茅姜。
/*?【迭代和遞歸】?*/
迭代比遞歸效率高奏夫!
迭代是一種思想(算法),結(jié)構(gòu)和使用上如同循環(huán)打瘪!
遞歸是一種思想(算法)友鼻,將大問題拆分成小問題傻昙,逐一解決小問題以解決大問題
要求大問題和小問題的解決方案是一致的!
遞歸的結(jié)構(gòu)和語法體現(xiàn)如圖函數(shù)彩扔。函數(shù)體內(nèi)調(diào)用函數(shù)本身妆档!
遞歸出口:當(dāng)該問題可以解決時(shí),則不用再遞歸
/*?【匿名函數(shù)/閉包函數(shù)】?*/
匿名函數(shù)虫碉,也叫閉包函數(shù)(closures)贾惦,允許臨時(shí)創(chuàng)建一個(gè)沒有指定名稱的函數(shù)。
1.?定義匿名函數(shù)時(shí)蔗衡,不需增加函數(shù)名纤虽。
2.?PHP對(duì)匿名函數(shù)的管理,以一個(gè)對(duì)象的方式進(jìn)行處理绞惦。
3.?匿名函數(shù)應(yīng)該存放到變量內(nèi)逼纸。
4.?匿名函數(shù)通過Closure類來實(shí)現(xiàn)
5.?可以使用函數(shù)作為函數(shù)的參數(shù)和返回值
6.?聲明函數(shù)時(shí)可以使用?use($param)?來向函數(shù)中傳入函數(shù)外的變量,結(jié)合變量引用來實(shí)現(xiàn)閉包
7.?可以用變量引用函數(shù)
$func?=?function?($e)?{
echo?$e;
};???//結(jié)束時(shí)济蝉,需分號(hào)結(jié)束杰刽,如同變量賦值
var_dump($func);?????//使用匿名函數(shù)
$func('ITCAST');?????//函數(shù)的調(diào)用
這不是可變函數(shù),而是對(duì)象王滤。Closure閉包類
//use語法
匿名函數(shù)傾向于值的概念贺嫂,可能出現(xiàn)在任何地方。
use可以使得匿名函數(shù)使用其外部作用域的變量雁乡。非全局第喳!
use與全局的區(qū)別:
use使用其外部作用域的變量
function?out()?{
$v?=?"in?out";
$func?=?function?()?use?(&?$v)?{
var_dump($v);
}
}
use類似參數(shù)的自動(dòng)傳遞,也支持值與引用的傳遞方式踱稍。
//作用
常作為'臨時(shí)函數(shù)'被調(diào)用(只在某個(gè)地方被調(diào)用的函數(shù))
例如:
PHP存在一個(gè)array_map()函數(shù)曲饱,功能是針對(duì)一個(gè)函數(shù)內(nèi)每個(gè)元素,去調(diào)用某個(gè)函數(shù)
操作結(jié)果(array)?=?array_map(操作函數(shù),?操作數(shù)組);
$result_arr?=?array_map(function?($v)?{return?$v3},?$arr);
//閉包用法實(shí)例
function?closureCreater()?{
$x?=?1;
return?function($fun?=?null)?use(&$x)?{//按引用傳值
echo?""?.?$x++;
$fun?and?$fun();
};
}
$x?=?"hello?world";
$test?=?closureCreater();
$test();
$test(function(){?echo?"closure?test?one";?});
$test(function(){?echo?"closure?test?two";?});
$test(function()?use($x){?echo?"".$x;});
//將函數(shù)保存為數(shù)組元素
$x?=?'outer?param.';
$arr?=?array();
$arr[]?=?function($str)use($x){?return?$str.$x;?};
echo?$arr[0]('test?fun?in?arr,');
/*?【數(shù)組】?*/
關(guān)聯(lián)數(shù)組:鍵和值有關(guān)聯(lián)珠月,鍵表示值的邏輯含義扩淀。
索引數(shù)組:鍵和值無關(guān)聯(lián),鍵表示值的位置啤挎。通常下標(biāo)從0開始驻谆,遞增元素
count($var?[,$mode])?//統(tǒng)計(jì)數(shù)組元素個(gè)數(shù)
$mode可選,設(shè)為1或true時(shí)則遞歸統(tǒng)計(jì)
$var非數(shù)組庆聘,返回1胜臊;$var未初始化或等于null或空數(shù)組,返回0
//鍵名的使用
整型數(shù)字鍵不需加引號(hào)($arr[1])
字符串?dāng)?shù)字鍵也不需加引號(hào)($arr?=?array('1'=>'abc');?$arr[1])
關(guān)聯(lián)數(shù)組伙判,字符串鍵需加引號(hào)($arr?=?array('a'=>'aaa');?$arr['a'])
關(guān)聯(lián)數(shù)組象对,雙引號(hào)中解析變量,可不加引號(hào)($arr?=?array('a'=>'aaa');?"$arr[a]")
/*?【指針】?*/
current/pos????返回當(dāng)前被內(nèi)部指針指向的數(shù)組單元的值澳腹,并不移動(dòng)指針织盼。
key????????????返回?cái)?shù)組中當(dāng)前單元的鍵名,并不移動(dòng)指針
next????????將數(shù)組中的內(nèi)部指針向前移動(dòng)一位酱塔,并返回移動(dòng)后當(dāng)前單元的值沥邻。先移動(dòng),再取值羊娃。
prev????????將數(shù)組的內(nèi)部指針倒回一位唐全,并返回移動(dòng)后當(dāng)前單元的值先移動(dòng),再取值蕊玷。
end????????????將數(shù)組的內(nèi)部指針指向最后一個(gè)單元邮利,并返回最后一個(gè)單元的值
reset????????將數(shù)組的內(nèi)部指針指向第一個(gè)單元,并返回第一個(gè)數(shù)組單元的值
each????返回?cái)?shù)組中當(dāng)前的鍵/值對(duì)并將數(shù)組指針向前移動(dòng)一步垃帅。
返回的是一個(gè)由鍵和值組成的長度為4的數(shù)組延届,下標(biāo)0和key表示鍵,下標(biāo)1和value表示值
在執(zhí)行each()之后贸诚,數(shù)組指針將停留在數(shù)組中的下一個(gè)單元
或者當(dāng)碰到數(shù)組結(jié)尾時(shí)停留在最后一個(gè)單元方庭。
如果要再用?each?遍歷數(shù)組,必須使用?reset()酱固。
1.?以上指針操作函數(shù)械念,除了key(),若指針移出數(shù)組运悲,則返回false龄减。而key()移出則返回null。
2.?若指針非法班眯,不能進(jìn)行next/prev操作希停,能進(jìn)行reset/end操作
3.?current/next/prev?????若遇到包含空單元(0或"")也會(huì)返回false。而each不會(huì)鳖敷!
list????把數(shù)組中的值賦給一些變量脖苏。list()是語言結(jié)構(gòu),不是函數(shù)
僅能用于數(shù)字索引的數(shù)組并假定數(shù)字索引從0開始
/*?可用于交換多個(gè)變量的值?*/?list($a,?$b)?=?array($b,?$a);
例:list($drink,?,?$power)?=?array('coffee',?'brown',?'caffeine');
1.?復(fù)制數(shù)組定踱,其指針位置也會(huì)被復(fù)制棍潘。
特例:如果數(shù)組指針非法,則拷貝的數(shù)組指針會(huì)重置崖媚,而原數(shù)組的指針不變亦歉。
【指針問題】
誰第一個(gè)進(jìn)行寫操作,就會(huì)開辟一個(gè)新的值空間畅哑。與變量(數(shù)組變量)值傳遞給誰無關(guān)肴楷。
數(shù)組函數(shù)current()被定義為寫操作,故會(huì)出現(xiàn)問題荠呐。
foreach遍歷的是數(shù)組的拷貝赛蔫,當(dāng)被寫時(shí)砂客,才會(huì)開辟一個(gè)新的值空間。
即呵恢,foreach循環(huán)體對(duì)原數(shù)組進(jìn)行寫操作時(shí)鞠值,才會(huì)出現(xiàn)指針問題。
如果開辟新空間時(shí)指針非法渗钉,則會(huì)初始化指針彤恶。
2.?如果指針位置出現(xiàn)問題,則reset()初始化一下就可解決鳄橘。
/*?【遍歷數(shù)組】?*/
*?先找到元素声离,再獲取鍵和值
foreach
foreach?(array_expression?as?[$key?=>]?&?$value)
當(dāng)foreach開始執(zhí)行時(shí),數(shù)組內(nèi)部的指針會(huì)自動(dòng)指向第一個(gè)單元瘫怜。
獲取元素信息后术徊,移動(dòng)指針,再執(zhí)行循環(huán)體
1.?foreach本身循環(huán)結(jié)構(gòu)鲸湃,break和continue適用于foreach
2.?foreach支持循環(huán)的替代語法弧关。
3.?$value是保存元素值的變量,對(duì)其修改不會(huì)改變數(shù)組的元素值
4.?$value支持元素值的引用拷貝唤锉,在$value前加上&即可
5.?$key不支持引用傳遞
6.?foreach遍歷的是原數(shù)組的拷貝世囊,而在循環(huán)體對(duì)數(shù)組的操作是操作原數(shù)組
即循環(huán)體對(duì)數(shù)組的操作,對(duì)原數(shù)組生效窿祥,對(duì)遍歷不生效株憾。
先拷貝一份數(shù)組用作遍歷
while...list...each
while?(list($key,?$val)?=?mysql_fetch_row($result))?=?each($arr)?{
echo?"$key?=>?$val\n";
}