php是一種服務(wù)器端解釋的腳本語言。
什么是PHP
PHP是一種服務(wù)器端腳本語言,他是專門為Web而設(shè)計的。
第一篇 使用PHP
連接操作符(.)將其編寫在一行代碼中。
1.3在html中嵌入PHP
服務(wù)器端腳本語言:PHP腳本在Web服務(wù)器上被解釋和執(zhí)行,這與在用戶機器上的Web瀏覽器中解釋并執(zhí)行。
的JS及其他客戶端技術(shù)是不同的。
1.3.2
echo 語句:將傳遞給其自身的字符串打印到瀏覽器窗口中。
在雙引號內(nèi),用一個字符串的內(nèi)容代替一個變量的操作就是插值。
echo “$tirequly tires<br />”;
單引號, echo $tirequly 'tire<br />';
在單引號中,變量名稱,或者任何其他文本都會不經(jīng)修改而發(fā)送給瀏覽器。
1.5.3 變量和文本
在示例腳本中,每一個echo語句中連接在一起的變量和字符串是完全不同的。變量是表示數(shù)據(jù)的符號
字符串是數(shù)據(jù)本身。
三種字符串類型: 具有雙引號: 其中變量會被替代
單引號:文本值
heredoc語法(<<<),通過制定一個用來結(jié)束字符串的結(jié)束標(biāo)記。
echo <<<theEnd
line1
line2
line3
theEnd
1.6 理解標(biāo)識符
標(biāo)識符是變量的名稱。
他不要求在使用變量之前聲明變量。當(dāng)?shù)谝淮谓o一個變量賦值時,你才創(chuàng)建了這個變量。
1.7 檢查變量類型
1.7.1 變量類型
特殊的類型:NULL和resource
NULL:沒有被賦值、已經(jīng)被重置或者被賦值為特殊NULL的變量
resource: 特定的內(nèi)置函數(shù)(例如數(shù)據(jù)庫函數(shù))將返回resource類型的變量。他們都代表
外部資源(例如數(shù)據(jù)庫連接),基本上不能直接操作一個resource變量,但是它通常被函數(shù)
返回,而且必須作為參數(shù)傳遞給其他函數(shù)
1.7.2 類型強度
弱類型語言,或者動態(tài)語言。
1.7.3 類型轉(zhuǎn)換
$abc=(float)$bdc;
1.7.4 可變變量
可變變量允許我們動態(tài)地改變一個變量的名稱。
原理:用一個變量的值作為另一個變量的名稱。
$varname='tireqty';
$$varname=5; 等價于 $tireqty=5;
1.8 聲明和使用常量
define('TIREPRICE',100);
常量由大寫字母組成。
使用時無$符號。
echo TIREPRICE;
了解預(yù)定義常量: phpinfo()函數(shù)。
1.9 理解變量的作用域
1.內(nèi)置超級全局變量可以在腳本的任何地方使用和課件
2.變量,一旦被聲明,將可以在全局可見;也就是說,他們可以在函數(shù)內(nèi)外使用。
3.在一個腳本中聲明的全局變量在整個腳本中是可見的,但不是在函數(shù)內(nèi)部。
$_GET和$_POST數(shù)組,這些被稱作超級全局變量,可以在任何地方使用和可見
1.10 使用操作符
若類型轉(zhuǎn)換,是字符串轉(zhuǎn)換成數(shù)字,如果其中包含‘e’和’E‘字符,它就會被當(dāng)做是科學(xué)
表示法并被轉(zhuǎn)換成浮點數(shù)。PHP會在字符串開始處尋找數(shù)字,沒找到,則為0.
1.10.2 字符串操作符
. 連接符
1.10.3 賦值操作符
4.引用操作符
&可以在關(guān)聯(lián)賦值中使用。
請記住,引用就像一個別名,而不是一個指針。都指向內(nèi)存相同的地址。
可以通過重置來改變所指向地址: unset($a);
1.10.4 比較操作符
=== 恒等操作符, 操作數(shù)相等并且具有相同的數(shù)據(jù)類型
1.10.5 邏輯操作符
$a x or $b 異或, 不同為true, 同為false.
1.10.6 位操作符
1.10.7 其他操作符
new和->,他們分別用來初始化類的實例和訪問類的成員。
錯誤抑制操作符
@可以在任何表達式前面使用,即任何有值的或者可以計算出值的表達式之前。
$a=@(57/0)
如果沒有@,這一行代碼將產(chǎn)生一個除0警告,若使用@會被抑制。
如果使用這種方法抑制了一些警告,一旦遇到一個警告,就要寫一些錯誤處理代碼。
如果啟用了php配置文件中的track_errors特性,錯誤信息將會被保存在全局變量$php_errormsg中。
3.執(zhí)行操作符。
執(zhí)行操作符實際上是一對操作符,是一對反向單引號。(``)
php將試著將反向單引號之間的命令當(dāng)做服務(wù)器端的命令行來執(zhí)行。表達式的值就是命令的執(zhí)行結(jié)果。
4.數(shù)組操作符
數(shù)組操作符([])允許訪問數(shù)據(jù)元素。 也可以使用=>操作符。
5.類型操作符
只有一個類型操作符:instanceof:檢查一個對象是否是特定類的實例。
1.13 使用可變函數(shù)
1.13.1 測試和設(shè)置變量類型
使用gettype(),傳遞一個變量,他將確定變量的類型并且返回一個包含類型名稱的字符串。
1.13.2 測試變量狀態(tài)
isset():若存在,則返回true.
empty():它的值是否為非空和非0.
1.13.3 變量的重解釋
可以通過調(diào)用一個函數(shù)來實現(xiàn)轉(zhuǎn)換變量數(shù)據(jù)類型的目的。
intval(var,int base) base 為進制
intfloat(var)
strval(var)
1.14 根據(jù)條件決策
條件結(jié)構(gòu)和重復(fù)結(jié)構(gòu)
1.14.3 else語句
1.15.2 for和foreach循環(huán)
for($i=1;$i<=$numname;$i++){
$temp=$name$i;
echo $$temp.'
';
}
1.16 從控制結(jié)構(gòu)或腳本中跳出
switch break
for continue;
結(jié)束整個php腳本的執(zhí)行,可以使用exit語句。
eg:
if($totalqty==0){
echo 'exit
';
exit;
}
1.17 使用可替換的控制結(jié)構(gòu)語法
endif\endswitch\endwhile\endfor\endforeach
eg:
if($toatl>0):
exit;
endif;
1.18 使用declare。
php的另一個控制結(jié)構(gòu)是declare結(jié)構(gòu),他沒有像其他結(jié)構(gòu)一樣在日常編程中使用
declare(directive){
//block
}
設(shè)置代碼塊的執(zhí)行命令--后續(xù)代碼如何執(zhí)行的規(guī)則。
第二章 數(shù)據(jù)的存儲和檢索
2.1 保存數(shù)據(jù)以便后續(xù)使用
保存到文件或保存到數(shù)據(jù)庫
2.2 存儲和檢索Bob的訂單
$_POST['address']
在本章中,我們將所有訂單都寫入同一個文件中。
2.3 文件處理
寫入文件
1.打開文件
2.讀取數(shù)據(jù)
3.關(guān)閉文件
2.4打開文件
fopen()函數(shù),參數(shù)指定文件模式,即如何使用它
2.4.1 選擇文件模式
1.打開文件為了只讀、只寫或讀和寫
2.如果要寫一個文件,可能希望覆蓋或者追加。若存在,也可以終止執(zhí)行
3.如果希望在一個區(qū)分了二進制方式和純文本方式的系統(tǒng)上寫一個文件,還必須指定采用的
方式。
w
2.4.2 使用fopen()打開文件
$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
$fp=fopen("$DOCUMENT_ROOT/../orders/d.txt",'w');
路徑 模式
DOCUMENT_ROOT代表文檔根目錄。為了安全,將它放我在文檔樹外部
第一個參數(shù):路徑
第二個:文件模式
第三個:在include_path中搜索。 true\false
第四個:遠程位置打開文件
2.4.3 通過FTP或HTTP打開文件
2.4。4 解決打開文件時可能遇到的問題
權(quán)限問題:根據(jù)服務(wù)器設(shè)置的不同,該腳本可能是作為web服務(wù)器用戶或者腳本所在目錄的擁有者
運行的。
2.5 寫文件
fwrite()或者fputs()
fputs()是fwrite()的別名函數(shù)。
fwrite($fp,$outputstring);
fwrite()函數(shù)的替換是:file_put_contents(filename,data,int flag,resource context)
2.5.1 fwrite()參數(shù)
fwrite($fp,$outputstring,length);
最大字符數(shù)
strlen()函數(shù):獲取字符串的長度
2.5.2 文件格式
記錄之間用\n分隔
數(shù)據(jù)域之間用\t分隔
2.6 關(guān)閉文件
fclose($fp);
2.7 只讀模式打開文件 fopen('../a.txt','rb')
2.7.2 知道何時讀完文件 feof()
while(!feof($fp))
{
$order=fgets($fp,999);
echo $order.'
';
}
feof() 唯一參數(shù)是文件指針,若文件指針指向文件末尾,將返回true
2.7.3 每次讀取一行數(shù)據(jù): fgets() \fgetss()\fgetcsv()
$order=fgets($fp,999);
fgetss(fp,length,[allowable_tags])
它可以過濾字符串中包含的PHP和HTML標(biāo)記,想留下的寫在allowable_tags里面
fgetcsv()函數(shù): $order=fgetcsv($fp,100,'\t').
以上代碼將從文件中讀取一行,并且在右制表符(\t)的地方將文件內(nèi)容分行,
返回一個數(shù)組。
2.7.4 讀取整個文件: readfile()\fpassthru()和file()
readfile() 可代替前面寫的所有腳本
readfile(pathname,include_path,context);
fpassthru()
$fp=fopen('path','rb');
fpassthru($fp);
file() 結(jié)果發(fā)送到一個數(shù)組。
$filearray=file('path');
一行一個元素保存在數(shù)組中。
2.7.5 讀取一個字符:fgetc()
從文件中一次讀取一個字符。
while(!feof($fp)){
$char=$getc($fp);
if(!feof($fp)) //getc()會返回EOF
echo ($char=='\n' ? '
':$char);
}
2.7.6 讀取任意長度:fread()
2.8 使用其他有用的文件函數(shù)
文件是否存在 file_exists(pathname)
文件大小 filesize(pathname)
刪除文件: unlink(pathname)
n12br() 將\n轉(zhuǎn)化成html的換行符
再文件中定位:rewind()\fseek()\ftell()
對文件指針進行定位,看它在文件中的位置
rewind() 定位到文件頭
ftell() 現(xiàn)在的位置
fseek() 將文件指針指向某個位置
2.9文件鎖定
flock(fp,operation)
LOCK_SE 讀鎖定
_EX 寫鎖定
_UN 釋放鎖定
_NB 防止在請求加鎖時發(fā)生阻塞
2.10 更好的方式:數(shù)據(jù)庫管理系統(tǒng)
第3章 使用數(shù)組
數(shù)組索引數(shù)組、關(guān)聯(lián)數(shù)組
3.2.1 數(shù)組索引數(shù)組 初始化
$products=array('titre','oil');
$products=range(1,10); 1-10的數(shù)字數(shù)組
3.2.2 訪問數(shù)組的內(nèi)容
$products[0]
3.2.3 使用循環(huán)訪問數(shù)組
foreach($producets as $current){
echo $current.' ';
}
3.3 使用不同索引的數(shù)組:關(guān)聯(lián)數(shù)組
$price=array('tire'=>100,'oil'=>10,);
訪問: $price['tire'];
循環(huán)訪問:
foreach($prices as $key =>$value)
{
echo $key.'='.$value.'<br />';
}
while($element=each($prices))
{
echo $element['key'].'='.$element['value'];
}
while(list($product,$price)=each($price)){
echo "$product - $price<br />";
}
each()函數(shù),數(shù)組將記錄當(dāng)前元素,如果希望再次使用使用reset($price);重置到
數(shù)組開始出。
3.4 數(shù)組操作符
3.5 多維數(shù)組
3.6 數(shù)組排序
sort函數(shù): 默認按升序排列。
asort()函數(shù) 和ksort()函數(shù)對關(guān)聯(lián)數(shù)組排序
asort()根據(jù)元素值進行排序。 value
ksort()根據(jù)關(guān)鍵字進行排序 key
反向排序: rsort\arsort\krsort\ 降序
3.7 多維數(shù)組的排序
用戶定義排序
usort() 告訴如何比較
function compare($x,$y){
if($x[1]==$y[1]){
return 0;
}else if($x[1]<$y[1]){
return -1;
}else
return 1;
}
usort($produts,'compare');
3.8 對數(shù)組進行重新排序
shuffle(array)將數(shù)組各元素隨機排序。
array_reverse()給出一個原來數(shù)組的反向排序。
$number=range(1,10);
$number=array_reverse($number);
3.9 從文件載入數(shù)組
$orders=file(pathname);
$number_of_orders=count($orders);
for($i=0;$i<$number_of_orders;$i++){
$line=explode('\t',orders[$i]);
$line[1]=intval($line[1]);
$line[2]=intval($line[2]);
$line[3]=intval($line[3]);
}
3.10 執(zhí)行其他數(shù)組操作
each()
current()
reset()
end()
next()
pos()
prev()
3.10 對數(shù)組的每一個元素應(yīng)用任何函數(shù) array_walk()
array_walk(array,func,userdata)
函數(shù)名 傳參入函數(shù)
函數(shù)可自帶數(shù)組的關(guān)鍵字和值。
function my_print($value){
echo "$value<br />";
}
array_walk($array,'my_print');
function my_multiply(&$value,$key,$facotr){
}
array_walk($array,my_multiply,3);
3.10.3 統(tǒng)計數(shù)組元素的個數(shù):
count($array) 元素個數(shù)
sizeof($array) 元素個數(shù)
array_count_values($array) 統(tǒng)計每個特定的值在數(shù)組中出現(xiàn)的次數(shù),
返回包含頻率表的關(guān)聯(lián)數(shù)組
3.10.4 將數(shù)組轉(zhuǎn)換成標(biāo)量變量 extract(array,extract_type)
將關(guān)聯(lián)數(shù)組轉(zhuǎn)成標(biāo)量變量,變量名稱是key,變量值是value.
第4章 字符串操作與正則表達式
4.2 字符串的格式化
4.2.1 字符串的整理 :trim()\ltrim()\rtrim()
清除多余空格
trim(string,operation):除去開始和結(jié)束位置的空格
opertation:要過濾的特殊的字符
ltrim() 左邊空格
rtrim()右邊空格
4.2.2 格式化字符串以便顯示
1.html格式化::n12br():
代替換行符
2.為打印輸出而格式化
和echo相同: print()\printf()\sprintf()
printf() 格式化、輸出瀏覽器
sprintf()返回格式化字符串
printf(“%s”,$toal);
想打印“%”,使用%%
printf(“%2\$s”,$toal,$toas); 2/$ 表示用列表中第二個參數(shù)替換。
這個方法可以在重復(fù)參數(shù)中使用
3.改變字符串字母大小寫
strtoupper()
strtolower()
4.2.3 格式化字符串以便存儲:addslashes()和stripslashes()
PHP提供了兩個轉(zhuǎn)義字符串的函數(shù)
add 增加
strip 移除
4.3 用字符串函數(shù)連接和分隔字符串
4.3.1 使用函數(shù)explode()\implode\join()
explode(separator,string,limit)
implode()和join()類似,和explode相反的作用,粘連在一起。
implode('@',array);
4.3.2 使用strtock()函數(shù)
從字符串中取出片段。
strtock(input,separator)
separator可是字符,也可是字符串。根據(jù)separator的每個字符進行分割
我們僅在第一次調(diào)用 strtok() 函數(shù)時使用了 string 參數(shù)。在首次調(diào)用后,該函數(shù)僅需要 split 參數(shù),這是因為它清楚自己在當(dāng)前字符串中所在的位置。如需分割一個新的字符串,請再次調(diào)用帶 string 參數(shù)的 strtok():
4.3.3 使用substr()函數(shù)
substr(string,start,length)
4.4 字符串比較
部分匹配和其它情況
4.4.1 字符串排序:strcmp()\strcasecmp()\strnatcmp()
strcmp(str1,str2) 返回0 相等
1 str1>str2
strcasecmp 不區(qū)分大小寫
strnatcmp 不區(qū)分大小寫 且自然排序,eg:2>12
4.4.2 使用strlen()函數(shù)測試字符串長度
4.5 使用字符串函數(shù)匹配和替換子字符串
4.5.1 在字符串中查找字符串:strstr()\strchr()\strrchr()\stristr()
strstr() 查找匹配的字符串或字符
strchr\strstr 完全一樣
strstr($feedback,'shop'); 從找到位置到末尾的字符串
無返回false.
stristr 不區(qū)分大小寫
strrchr 最后出現(xiàn)目標(biāo)關(guān)鍵字的剩下的所有字符
4.5.2 查找子字符串的位置:strpos()\strrpos()
推薦這個。
strpos(string,needle,offset) 第一次出現(xiàn)位置 offset 偏移量
strrpos 最后出現(xiàn)的位置
失敗返回false
要注意false在弱語言中等于0,而0是字符串的一個字符。故使用===
if(strpos(string,'H')===false)
4.5.3 替換子字符串:str_replace()\substr_replace()
str_replace(needle,new_needle,string) 返回替換后的結(jié)果
substr_replace(string,replacement,start)
4.6 正則表達式
4.6.2 字符集和類
[a-z]at [aeiou] [a-zA-Z]
任何包含在方括號中的內(nèi)容都是一個字符類--一個被匹配的字符所屬的字符集合。
只匹配一個。
[^a-z] 不屬于a-z之間的字符 ^表示否
4.6.3 重復(fù)
表示某個字符串不止一次的出現(xiàn)
*代表可重復(fù)0或多次
+代表 1或多次
[a-z]+ 最少匹配一次的a到z之間的字符
4.6.4 子表達式
將一個表達式分隔成幾個子表達式。圓括號表示
(very )*large
匹配: large、 very large、 very very large
4.6.5 子表達式計數(shù)
表達允許重復(fù)的次數(shù)
(very ){1,3} 重復(fù)1-3次
(very ){3} 重復(fù)3次
([a-z]at){2,} 至少重復(fù)2次
([a-z]at)+ 至少重復(fù)一次
4.6.6 定位到字符串的開始或末尾
^ 用于開始
$ 用于末尾,表示子字符串必須出現(xiàn)在字符串末尾
4.6.7分支
可以用豎線表示一個選擇
com|edu|net
4.6.8 匹配特殊字符
如果要匹配特殊字符。如,.等, 需要加反斜杠\
正則表達式模式必須包含在單引號的字符串中。
表示雙斜杠使用 \\
如果雙引號引用的PHP字符串使用反斜杠字符, 需要寫 \\\\
$ \\\$
eg: ^([abc]*d){1,3}\.;|$
4.7用正則表達式查找子字符串: ereg()\eregi()
ereg(pattern,search,array match). 把匹配結(jié)果放在match中
eregi 不區(qū)分大小寫
4.8 用正則表達式替換子字符串
ereg_replace(pattern,replacement,search)
4.9 使用正則表達式分隔字符串
split(pattern,search)
!!和正則表達式相比,盡量使用字符串函數(shù)效率高。
第五章 代碼重現(xiàn)和函數(shù)編寫
5.1 代碼重用的好處
1.成本
2.可靠性
3.一致性
5.2 require()和include()函數(shù)
允許重新使用任何類型的代碼
require()和include()可以將一個文件載入到php腳本中
類似于#include語句
使用require()和include()引入函數(shù)庫,非常有用。防止錯誤引入同樣的函數(shù)庫
2次。
5.2.1 文件擴展名和require()函數(shù)
require('resuable.php');
使用require()語句時,必須注意處理文件擴展名和PHP標(biāo)記的不同方式。
5.2.2 使用require()制作web站點的模版
如果web頁面具有一致外觀,可以在php中使用require()語句將模版和標(biāo)準(zhǔn)元素加入。
一個常見的約定就是調(diào)用那些包含在其它文件something.inc中的部分文件代碼,這些文件代碼
若不被調(diào)用,將會停止執(zhí)行。
這個文件可以包含任何希望在一個腳本中輸入的內(nèi)容,其中包括php、文本\標(biāo)記
當(dāng)需要一個文件時,可以使用require()語句。將被請求的文件內(nèi)容代替,然后執(zhí)行腳本。
這就意味著,讓載入main。php。
當(dāng)使用require()語句時,必須注意處理文件擴展名和php標(biāo)記的不同方式。
PHP并不會查看所需文件的擴展名。這就意味著,只要不想直接調(diào)用這個文件,就可以任意
命名該文件。當(dāng)使用require()語句載入語句時,它會作為php文件的一部分被執(zhí)行。
通常,如果PHP語句放在一個HTML文件中時,他們是不會被處理的。PHP通常解析擴展名被
定義為.php文件。但是,如果通過require語句載入page.html,文件內(nèi)的任何PHP命令
會被處理。
require()語句調(diào)用時,它會被執(zhí)行。
文件時.html的,不處理。
文件時.php,才會處理。
但是通過require(),.html也會被處理。
但是一般擴展名是 .inc或 .php。
需要注意,擴展名為.inc或其它一些文件保存在web文檔樹內(nèi)種,而且用戶可以在直接在如,
用戶將以普通文本的形勢,
5.3 在php中使用函數(shù)
函數(shù)是一個給出了調(diào)用接口的自包含模塊,它可以執(zhí)行一些任務(wù),還可以返回結(jié)果。
5.3.1 調(diào)用函數(shù)
fopen(string[,resource context])
方括號指明了這個參數(shù)是可選的。
5.3.2 調(diào)用未定義的函數(shù):出錯
5.3.3 理解字母大小寫和函數(shù)名稱
函數(shù)調(diào)用不區(qū)分大小寫。 函數(shù)命名:都用小寫字母
函數(shù)名稱和變量不一樣,變量分大小寫,函數(shù)不區(qū)分。
5.4 理解為什么要定義自己的函數(shù)
5.5 了解基本的函數(shù)結(jié)構(gòu)
希望在一個函數(shù)中退出php并輸入HTML腳本:
<?php
function my_function(){
?>
my function was call;
<?php
}
?>
函數(shù)的命名
php不支持函數(shù)的重載。
!!可變函數(shù):$name();
根據(jù)$name的值確定,取出$name中的值,尋找具有那個名稱的函數(shù),并且
調(diào)用該函數(shù)。
5.6使用參數(shù)
function create_table($data){
echo '<table border="1">';
reset($data);
$value=current($data);
while($value){
echo $value;
$value=next($data);
}
}
5.7 理解作用域
這塊可以翻回來看一下
函數(shù)內(nèi)部和外部聲明同一個變量名是合法的,互不影響的。當(dāng)在函數(shù)內(nèi)部第一次調(diào)用的時候,
它會聲明,和外部的無關(guān),函數(shù)調(diào)用結(jié)束后,刪除。
作用域:
函數(shù)外的變量到了函數(shù)的內(nèi)部,無法訪問的。如果能夠訪問的話。還需要傳值做什么。傳值就是為了讓函數(shù)接受參數(shù)。
超級全局變量哪都能訪問。
靜態(tài)變量會累加。 外部訪問不到。
全局變量在函數(shù)外聲明,想要在內(nèi)部訪問,需要提前聲明一下,才能使用。
外部聲明variable, 函數(shù)內(nèi)部第一次調(diào)用輸出時,會創(chuàng)建一個新的變量, 所以輸出0
require 在函數(shù)內(nèi)部,就是函數(shù)作用域。
外部,就是全局作用句。
5.8 函數(shù)的引用傳遞和值傳遞
function myfun(&$value){
}
5.9使用return 關(guān)鍵字
5.10 實現(xiàn)遞歸
第6章 面向?qū)ο蟮腜HP
面向?qū)ο蟮拈_發(fā)方法試圖在系統(tǒng)中引入對象的分類、關(guān)系和屬性
6.1.1 類和對象
對象的屬性是于對象相關(guān)的特性或變量。
對象的操作是對象可以執(zhí)行的方法。
!對象的操作也就是對象的接口
對象是一個保存數(shù)據(jù)和操作這些數(shù)據(jù)的操作方法的唯一、可標(biāo)識的集合。
數(shù)據(jù)封裝
6.1.2 多態(tài)性
指不同類的同一操作可以有不同的行為。
6.1.3 繼承
6.2 在php中創(chuàng)建類、屬性和操作
6.2.1 類的結(jié)構(gòu)
class classname{
public $attribute;
function operation(){
}
}
6.2.2 構(gòu)造函數(shù)
class classname{
function __constrct($param){
}
}
6.2.3 析構(gòu)函數(shù)
function __destruct(){}
6.3 類的實例化
$a=new classname();
6.4 使用類的屬性
$this->attribute
使用__get()__set()
class classnae{
public $attribute;
function __get($name){
return $this->$name;
}
function __set($name,$value)
{
$this->$name=$value;
}
}
我們并不直接訪問__get()\__set(),而是使用
$a->attribute=5;
$a->attribute
通過編寫get\set方法,可以控制訪問的入口,設(shè)置邊界檢查,確認數(shù)據(jù)是否正確。
或者我們需要從數(shù)據(jù)庫取出數(shù)據(jù),只需修改get和set即可。
6.5 使用private和public關(guān)鍵字控制訪問
protect修飾,只能類內(nèi)部訪問,但是可被繼承,繼承后只能內(nèi)部使用。
而private 無法繼承。
默認是public,如聲明類時,不寫public
6.6 類操作的調(diào)用
$a->operation1();
6.7 在PHP中實現(xiàn)繼承
class B extends A{
}
6.7.1 通過繼承使用private和protected訪問修飾符控制可見性
!??!protect可以被繼承,但繼承后,只能在類內(nèi)部使用。
6.7.2 重載(java中叫做重寫,覆蓋父類)
如果想使用父類的最初版本: parent::opertaion();
A:operation();
6.73. 使用final關(guān)鍵字禁止繼承和重載
當(dāng)在一個函數(shù)聲明前面使用這個關(guān)鍵字時,這個函數(shù)將不能在人惡化子類中
被重載。
也可禁止類被繼承。
6.74 理解多重繼承
PHP支持單一繼承
6.7.5 實現(xiàn)接口q
接口的思想是指定一個實現(xiàn)了該接口的類必須實現(xiàn)的一系列函數(shù)。
implements
6.8類的設(shè)計
web開發(fā)中可能使用的類可能包括網(wǎng)頁、用戶界面組件、購物車、錯誤處理、商品分類
顧客。
6.9 編寫類代碼
class page{
public $content;
public $title="TLA";
public $keyword="dsd";
public $button=array(
"Home"=>"home.php",
"Contant"=>"contact.php"
);
function __set($name,$value){
$this->$name=$value;
}
function Display(){
echo '<html>\n<head>\n';
$this->DisplayTitle();
$this->DisplayKeyWords();
$this->DisplayStyles();
echo '</head>\n<body>\n';
$this->DisplayHeader();
$this->DisplayMenu($this->buttons);
echo $this->content;
$this->DsipalyFooter();
echo "</body>\n</html>\n";
}
function DisplayTitle(){
echo '<title>'.$this->title.'</title>';
}
function DisplayKeywords(){
echo '<meta name=\"keywords\" content=\''.$this->keywords.'\'/>';
}
public function DisplayStyles(){
?>
<style>
</style>
<?php
}
public function DisplayMenu($buttons){
$width=100/count($button);
while(list($name,$url)=each($buttons)){
$this->DisplayButton($width,$name,$url,!$this->IsURLCurrentPage
($url));
}
}
}
<?php
require("page.inc");
$homepage=new Page();
$homepage->content="";
$homepage->Display();
?>
6.10 理解PHP面向?qū)ο蟮母呒壒δ?br>
6.10.1 使用Per-Class常量
PHP提供了Per-Class常量
<?php
class Math{
const pi=3.14;
}
echo 'Math::pi='.Math::pi.'\n';
6.10.2 實現(xiàn)靜態(tài)方法:
PHP允許使用static關(guān)鍵字。
靜態(tài)方法,不能使用this關(guān)鍵字。
class Math{
static function squared($input){
return $input;
}
}
ehco Math::squared(8);
6.10.3 檢查類的類型和類型提示
instanceof關(guān)鍵字允許檢查一個對象的類型。
function check_hink(B $someclass){ //傳入的必須是B的實例。
}
6.10.4 延遲靜態(tài)綁定
該特性允許在一個靜態(tài)繼承的上下文中對一個被調(diào)用類的引用。
class A{
public static function who(){
echo __CLASS__;
}
public static function test(){
static::who();
}
}
class B extends A{
public static function who(){
echo __CLASS__;
}
}
B::test();
輸出: B
6.10.5 克隆對象
PHP提供clone關(guān)鍵字。允許復(fù)制一個已有的對象。
$c=clone $b;
__clone()方法中的一個很好特性就是在使用默認行為創(chuàng)建一個副本后能夠被調(diào)用。
這樣,在這個階段,可以只改變希望改變的內(nèi)容。
在__clone()方法中添加的最常用功能就是確保作為引用進行處理的類屬性能過正確復(fù)制。
如果要克隆一個包含有對象引用的類,可能需要獲得該對象的第二個副本,而不是該對象的
第二個引用。
6.10.6 使用抽象類
類不能被實例化,類方法也沒有實現(xiàn),只提供類方法的聲明,沒有實現(xiàn)。
6.10.7 使用__call()重載方法
__call()方法,該方法用來實現(xiàn)方法的重載。
public function __call($method,$p){
if($method=='display'){
if(is_object($p[0])){
$this.displayObject($p[0]);
}else if(is_array($p[0])){
$this->displayArray($p[0]);
}
}
}
$ov=new overload();
$ov->display(array(1,2,3));
$ov->display('cat');
6.10.8 使用__autoload()方法
另一個特殊的函數(shù)是__autoload().單獨的函數(shù)
會自動調(diào)用你所需要實例化的類文件。
function __autoload($name){
include_once $name.'.php';
}
7.1 異常處理的概念
手動拋出異常
try{
throw new Exception("A",43);
}catch(Exception $e){
echo "ss".$e->getCode();
}
7.3 用戶自定義異常