1.PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本預(yù)處理器”)是一種通用開(kāi)源腳本語(yǔ)言。語(yǔ)法吸收了C語(yǔ)言、Java和Perl的特點(diǎn),利于學(xué)習(xí),使用廣泛,主要適用于Web開(kāi)發(fā)領(lǐng)域。PHP 獨(dú)特的語(yǔ)法混合了C、Java、Perl以及PHP自創(chuàng)的語(yǔ)法。它可以比CGI或者Perl更快速地執(zhí)行動(dòng)態(tài)網(wǎng)頁(yè)。用PHP做出的動(dòng)態(tài)頁(yè)面與其他的編程語(yǔ)言相比,PHP是將程序嵌入到HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)文檔中去執(zhí)行,執(zhí)行效率比完全生成HTML標(biāo)記的CGI要高許多;PHP還可以執(zhí)行編譯后代碼,編譯可以達(dá)到加密和優(yōu)化代碼運(yùn)行,使代碼運(yùn)行更快。
? ? ? ?中文名 超文本預(yù)處理器 外文名 PHP: Hypertext Preprocessor 編程范型 面向?qū)ο蟆⒚钍骄幊?設(shè)計(jì)者 Rasmus Lerdorf 維? ? 護(hù) The PHP Group 最新版本 PHP 5.6.0(28 Aug 2014)?
? ? ? ? ? ? ? ? ? ? ? ?(10)類型檢查:PHP 4.0 支持同一操作符用于評(píng)類型檢查:===(3 等號(hào)運(yùn)算符,恒等計(jì)算符),為在兩個(gè)值和其類型之間作檢查。例如,'3' ===3 將視為假 ( 類型是不同的),而 3 ==3 ( 相等判斷,不比較類型 ) 將視為真。
? ? ? ? ? ?環(huán)境配置編輯Windows下軟件需求(最新版)Windows Vista 或更高版本;Apache 2+ 或 IIS 6+ 或 Nginx安裝過(guò)程將 Apache 1.3.19 安裝到 C:\Web\apache\ 目錄下。
將 PHP 4.0.5 解壓到 C:\Web\php\ 目錄下。將 MySQL 3.23.38 安裝到 C:\Web\mysql\ 目錄下。
將 C:\web\php\php4ts.dll 文件拷貝到 C:\WINNT\system32\ 目錄下。
將 C:\web\php\php.exel 文件拷貝到 C:\WINNT\ 目錄下。
將 C:\web\php\php.ini-dist 文件拷貝到 C:\WINNT\ 目錄下,并將php.ini-dist 更名為 php.ini。
運(yùn)行 C:\Web\apache\Apache\Apache.exe-i –n運(yùn)行 C:\Web\mysql\bin\mysqld-nt.exe--install編輯 C:\WINNT\php.ini找到 “extension_dir = ./ ” 字段,將其改為 extension_dir = "C:\myphp\php\extensions"。編輯 C:\Web\apache\Apache\conf\httpd.conf找到“ #BindAddress*” 字段將其改為 BindAddress127.0.0.1。(如果主機(jī)有固定IP地址,此處改為主機(jī)IP地址。如 BindAddress 211.101.152.106),找到 “ServerName” 字段,將其改為 ServerName localhost。(如主機(jī)有固定主機(jī)名,此處改為主機(jī)的主機(jī)名。如ServerName bn001)。
找到“ ScriptAlias /cgi-bin/ "C:/Web/apache/Apache/cgi-bin/" ” 字段,在其下面加入 ScriptAlias /php/ "C:/Web/php/"。找到 “# And for PHP 4.x,use: ” 字段,在其后面加入:12AddTypeapplication/x-httpd-phpActionApplication/x-httpd-php"c:/Web/php/php.exe"找到“ #LoadModule usertrack_module modules/mod_usertrack so” 字段,LoadModule php4_module c:/web/php/sapi/php4apache.dllUNIX下所需軟件php-3.0.14-win32.zip;php-3.0.14-win32.zip;mysql-shareware-3.22.32-win.zip所有軟件均安裝在/export/home/guoj/下,也可在其他目錄。
安裝mysql12345678910111213141516171819202122232425262728gzip-dcmysql- ? ? ? ?3.22.30.tar.gz|tarxvf-cdmysql-3.22.30./configure-prefix=/export/home/guoj/mysqlmakemakeinstallscripts/mysql_install_dbcd../mysql/binbin/safe_mysqld&安裝phpapachegzip-dcapache_1.3.11.tar.gz|tarxvf-gzip-dcphp-3.0.11.tar.gz|tarxvf-cdapache_1.3.11./configure-prefix=/export/home/guoj/wwwcd../php-3.0.11./configure-with-apache=/export/home/guoj/apache_1.3.11-with-mysql=/export/home/guoj/mysql-enable-track-varsmakemakeinstallcd../apache_1.3.11./configure--prefix=/export/home/guoj/www--activate-module=src/modules/php3/libphp3.aPmakemakeinstallcd../php-3.0.11cd../php3.ini-distphp3.iniviphp3.ini修改php3.inidoc_root=/export/home/guoj/www/htdocs/extension_dir=/export/home/guoj/php-3.0.11/extension=php3_mysql.dllcpphp3.ini/usr/local/lib/php3.inivi../www/conf/httpd.conf加上以下幾句:1234OptionsFollowSymLinks
AllowOverrideNone
../www/bin/apachectlstart
其他方面編輯
PHP 在數(shù)據(jù)庫(kù)方面的豐富支持,也是它迅速走紅的原因之一,它支持下列的數(shù)據(jù)庫(kù)或是數(shù)據(jù)文件:
Adabas 、D、 DBA、dBase 、dbm 、filePro 、Informix 、InterBase、mSQL 、Microsoft SQL Server、·MySQL、Solid、Sybase、 Oracle 、PostgreSQL
而在 Internet 上它也支持了相當(dāng)多的通訊協(xié)議 (protocol),包括了與電子郵件相關(guān)的 IMAP,POP3;網(wǎng)管系統(tǒng) SNMP;網(wǎng)絡(luò)新聞NNTP;帳號(hào)共用 NIS;全球信息網(wǎng) HTTP 及 Apache 服務(wù)器;目錄協(xié)議 LDAP 以及其它網(wǎng)絡(luò)的相關(guān)函數(shù)。
除此之外,用 PHP 寫(xiě)出來(lái)的 Web 后端 CGI 程序,可以很輕易的移植到不同的操作系統(tǒng)上。例如,先以 Linux 架的網(wǎng)站,在系統(tǒng)負(fù)荷過(guò)高時(shí),可以快速地將整個(gè)系統(tǒng)移到 SUN 工作站上,不用重新編譯 CGI 程序。面對(duì)快速發(fā)展的 Internet,這是長(zhǎng)期規(guī)劃的最好選擇。
相關(guān)語(yǔ)法及概念
php 支持八種原始類型。
四種標(biāo)量類型:boolean(布爾型) integer(整型) float(浮點(diǎn)型,也作“double”) string(字符串)
兩種復(fù)合類型:array(數(shù)組)object(對(duì)象)
最后是兩種特殊類型:resource(資源)NULL
為了確保代碼的易讀性,本手冊(cè)還介紹了一些偽類型:mixed、number、callback
語(yǔ)法(例子中均忽略了PHP代碼邊界符 ):
注釋的語(yǔ)法有三種:
//comment這個(gè)是單行注釋
/*comment*/這個(gè)是多行注釋
#comment這個(gè)是腳本類型注釋,很少用
基本的結(jié)構(gòu)控制語(yǔ)句:
//分支結(jié)構(gòu)(選擇結(jié)構(gòu))
if(condition){
//Statement
}
if(condition){
//Statement
}else{
//Statement
}
if(condition){
//Statement
}elseif(condition){
//Statement
}
//多分支結(jié)構(gòu)
switch($變量){
case'值':
//Statement
break;
case'值2':
//Statement
break;
default:
//Statement
}
//循環(huán)結(jié)構(gòu)
while(condition){
//Statement
}
do{
//Statement
}while(condition);
for(初始化;判斷;變化){
//Statement
}
//數(shù)組遍歷專用循環(huán)語(yǔ)句
foreach($Arrayas$value){
echo$value;
}
foreach($Arrayas$key=>$value){
echo$key;
echo$value;
}
一個(gè)PHP實(shí)例:
12//php中string類型的拼接符和其它大多數(shù)采用"+"號(hào)運(yùn)算符不一樣,而是采用"."號(hào)運(yùn)算
//在一般語(yǔ)言中用于對(duì)象屬性和方法調(diào)用的"."運(yùn)算符,則和C語(yǔ)言的結(jié)構(gòu)體一樣用"=>"
php對(duì)面向?qū)ο蟮闹С?/p>
面向?qū)ο缶幊痰母拍睿?/p>
不同的作者之間說(shuō)法可能不一樣,但是一個(gè)OOP語(yǔ)言必須有以下幾方面:
1.抽象數(shù)據(jù)類型和信息封裝
2.繼承
3.多態(tài)
在PHP中是通過(guò)類來(lái)完成封裝的:
//在OOP類中,通常采用大雙駝峰命名法,每個(gè)單詞的首字母都大寫(xiě)
classSomething{
//作用域修飾符:public公共的;private私有的;protected受保護(hù)的;
//屬性的名稱一般用全小寫(xiě)
private$x=null;//在編程建議中,內(nèi)部使用的屬性應(yīng)該給私有修飾符,然后通過(guò)方法取值賦值
//方法的名稱一般用小駝峰命名法,第一個(gè)單詞全小寫(xiě),剩下的單詞首字母大寫(xiě)
//因?yàn)镻HP不會(huì)自動(dòng)為變量使用$this所以必須主動(dòng)加上$this偽變量來(lái)指向操作的對(duì)象
publicfunctionsetX($v){
$this->x=$v;
}
publicfunctiongetX(){
return$this->x;
}
}
當(dāng)然你可以按自己的喜好進(jìn)行定義,但最好保持一種標(biāo)準(zhǔn),這樣會(huì)更有效。數(shù)據(jù)成員在類中使用"var"聲明來(lái)定義,在給數(shù)據(jù)成員賦值之前,它們是沒(méi)有類型的。一個(gè)數(shù)據(jù)成員可以是一個(gè)整數(shù),一個(gè)數(shù)組,一個(gè)相關(guān)數(shù)組(associative array)或者是一個(gè)對(duì)象。方法在類中被定義成函數(shù)形式,在方法中訪問(wèn)類成員變量時(shí),你應(yīng)該使用$this->name,否則對(duì)一個(gè)方法來(lái)說(shuō),它只能是局部變量。
使用new操作符來(lái)創(chuàng)建一個(gè)對(duì)象:
1
$obj=newSomething;
然后你可以使用成員函數(shù)通過(guò):$obj->setX(5);
$see=$obj->getX();
echo$see;
在這個(gè)例子中,setX成員函數(shù)將5賦值給對(duì)象的成員變量x(不是類的),然后getX返回它的值5。可以象:$obj->x=6那樣通過(guò)類引用方式來(lái)存取數(shù)據(jù)成員,這不是一個(gè)很好的OOP習(xí)慣。我強(qiáng)烈建議通過(guò)方法來(lái)存取成員變量。如果你把成員變量看成是不可處理的,并且只通過(guò)對(duì)象句柄來(lái)使用方法,你將是一個(gè)好的OOP程序員。不幸的是,PHP不支持聲明私有成員變量,所以不良代碼在PHP中也是允許的。繼承在PHP中很容易實(shí)現(xiàn),只要使用extends關(guān)鍵字。
classAnotherextendsSomething{
private$y;
publicfunctionsetY($v){
$this->y=$v;
}
functiongetY(){
return$this->y;
}
}
"Another"類的對(duì)象擁有了父類(Something)的全部的數(shù)據(jù)成員及方法,而且還加上了自己的數(shù)據(jù)成員和方法。
你可以使用
$obj2=newAnother;
$obj2->setY(5);
echo$obj2->getY();
PHP只支持單繼承,所以你不能從兩個(gè)或兩個(gè)以上類派生出新的類來(lái)。你可以在派生類中重定義一個(gè)方法,如果我們?cè)?Another"類中重定義了getX方法(方法重寫(xiě)),我們就不能使 用"Something"中的getX方法了。如果你在派生類中聲明了一個(gè)與基派同名的數(shù)據(jù)成員,那么當(dāng)你處理它時(shí), 它將“隱藏”基類的數(shù)據(jù)成員。
你可以在你的類中定義構(gòu)造函數(shù)。構(gòu)造函數(shù)是一個(gè)與類名同名的方法,當(dāng)你創(chuàng)建一個(gè)類的對(duì)象時(shí)會(huì)被調(diào)用,例如:
classSomething{
private$x=null;
//新版本的構(gòu)造函數(shù)放棄使用類名,而統(tǒng)一使用__construct()
publicfunction__construct($x){
$this->x=$x;
}
publicfunctionsetX($v){
$this->x=$v;
}
publicfunctiongetX(){
return$this->x;
}
//析構(gòu)函數(shù)
publicfunction__destruct(){
}
}
所以你可以創(chuàng)建一個(gè)對(duì)象,通過(guò):
1
$obj=newSomething(6);
構(gòu)造函數(shù)會(huì)自動(dòng)地把6賦值給數(shù)據(jù)變量x。構(gòu)造函數(shù)和方法都是普通的PHP函數(shù)(”__“兩個(gè)下劃線,魔術(shù)方法),所以你可以使用缺省參數(shù)。
publicfunction__construct($x="3",$y="5"){
}
接著:$obj=newSomething();//x=3andy=5
$obj=newSomething(8);//x=8andy=5
$obj=newSomething(8,9);//x=8andy=9
缺省參數(shù)使用C++的方式,所以你不能忽略Y的值,而給X一個(gè)缺省參數(shù),參數(shù)是從左到右賦值的,如果傳入的參數(shù)少于要求的參數(shù)時(shí),其作的將使用缺省參數(shù)。
當(dāng)一個(gè)派生類的對(duì)象被創(chuàng)建時(shí),只有它的構(gòu)造函數(shù)被調(diào)用,父類的構(gòu)造函數(shù)沒(méi)被調(diào)用,如果你想調(diào)用基類的構(gòu)造函數(shù),你必須要在派生類的構(gòu)造函數(shù)中用parent::__construct()調(diào)用。可以這樣做是在派生類中所有父類的方法都是可用的。
classAnotherextendsSomething{
publicfunction__construct(){
parent::__construct(5,6);//顯示調(diào)用基類構(gòu)造函數(shù)
}
}
OOP的一個(gè)很好的機(jī)制是使用抽象類。抽象類是不能實(shí)例化,只能提供給派生類一個(gè)接口。設(shè)計(jì)者通常使用抽象類來(lái)強(qiáng)迫程序員從基類派生,這樣可以確保新的類包含一些期待的功能。在PHP中沒(méi)有標(biāo)準(zhǔn)的方法,但是:如果你需要這個(gè)特性,可以通過(guò)定義基類,并在它的構(gòu)造函數(shù)后加上"die" 的調(diào)用,這樣就可以保證基類是不可實(shí)例化的,在每一個(gè)方法(接口)后面加上"die" 語(yǔ)句,所以,如果一個(gè)程序員在派生類中沒(méi)有覆蓋方法,將引發(fā)一個(gè)錯(cuò)誤。而且因?yàn)镻HP 是無(wú)類型的,你可能需要確認(rèn)一個(gè)對(duì)象是來(lái)自于你的基類的派生類,那么在基類中增加一個(gè)方法來(lái)實(shí)義類的身份(返回某種標(biāo)識(shí)id),并且在你接收到一個(gè)對(duì)象參數(shù)時(shí)校驗(yàn)這個(gè)值。當(dāng)然,如果一個(gè)不好的邪惡程序員在派生類中覆蓋了這個(gè)方法,這種方法就不起作用了,不過(guò)一般問(wèn)題多在懶惰的程序員身上,而不是邪惡的程序員。
當(dāng)然,能夠讓基類對(duì)程序員無(wú)法看到是很好的,只要將接口打印出來(lái)做他們的工作就可以了。PHP 5 引入了析構(gòu)函數(shù)的概念,這類似于其它面向?qū)ο蟮恼Z(yǔ)言,如 C++。析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷(xiāo)毀時(shí)執(zhí)行。[3]
重載(與覆蓋不同)在PHP中不支持,因?yàn)镻HP是弱類型語(yǔ)言。在OOP中,你可以重載一個(gè)方法來(lái)實(shí)現(xiàn)兩個(gè)或重多的方法具有相同的名字,但是有不同數(shù)量或類型的參數(shù)(這要看語(yǔ)言)。PHP 是一種松散類型的語(yǔ)言,所以通過(guò)類型重載不起作用,然而通過(guò)參數(shù)的個(gè)數(shù)不同來(lái)重載也不起作用。
有時(shí)在OOP中重載構(gòu)造函數(shù)非常好,這樣你可以通過(guò)不同的方法創(chuàng)建對(duì)象(變量函數(shù))。在PHP中實(shí)現(xiàn)它的技巧是:
classMyclass{
publicfunctionMyclass(){
$name="Myclass".func_num_args();//這個(gè)函數(shù)返回的是傳過(guò)來(lái)參數(shù)的個(gè)數(shù)
$this->$name();//這里使用的是一個(gè)變量函數(shù),以這個(gè)變量的值作為函數(shù)的名稱調(diào)用
}
publicfunctionMyclass1($x){
//code
}
publicfunctionMyclass2($x,$y){
//code
}
}
通過(guò)在類中的額外的處理,使用這個(gè)類對(duì)用戶是透明的:
$obj1=newMyclass('1');//將調(diào)用Myclass1
$obj2=newMyclass('1','2');//將調(diào)用Myclass2
有時(shí)這個(gè)非常好用。
多態(tài)
多態(tài)是對(duì)象的一種能力,它可以在運(yùn)行時(shí)刻根據(jù)傳遞的對(duì)象參數(shù),決定調(diào)用哪一個(gè)對(duì)象的方法。例如,如果你有一個(gè)figure的類,它定義了一個(gè)draw的方法。并且派生了circle和rectangle 類,在派生類中你覆蓋了draw方法,你可能還有一個(gè)函數(shù),它希望使用一個(gè)參數(shù)x,并且可以調(diào)用$x->draw()。如果你有多態(tài)性,調(diào)用哪個(gè)draw方法就依賴于你傳遞給這個(gè)函數(shù)的對(duì)象類型。
多態(tài)性在象PHP這樣的解釋語(yǔ)言(想象一下一個(gè)C++編譯器生成這樣的代碼,你應(yīng)該調(diào)用哪一個(gè)方法?你也不知道你擁有的對(duì)象是什么類型的,好,這不是重點(diǎn))是非常容易和自然的。所以PHP當(dāng)然支持多態(tài)性。
classCalc{
functionniceDrawing($x){//假設(shè)這是Board類的一個(gè)方法
$x->draw();
}
}
classCircle{
publicfunctiondraw(){
echo"畫(huà)了一個(gè)圓";
}
}
classRectangle{
publicfunctiondraw(){
echo"畫(huà)了一個(gè)矩形";
}
}
$board=newCalc;
$obj=newCircle(3,187);
$obj2=newRectangle(4,5);
$board->niceDrawing($obj);//將調(diào)用Circle的draw方法
$board->niceDrawing($obj2);//將調(diào)用Rectangle的draw方法
用PHP進(jìn)行面向?qū)ο缶幊?/p>
一些"純化論者(purists)"可能會(huì)說(shuō)PHP不是一個(gè)真正的面向?qū)ο蟮恼Z(yǔ)言,這是事實(shí)。PHP 是一個(gè)混合型語(yǔ)言,你可以使用OOP,也可以使用傳統(tǒng)的過(guò)程化編程。然而,對(duì)于大型項(xiàng)目,你可能想/需要在PHP 中使用純的OOP去聲明類,而且在你的項(xiàng)目只用對(duì)象和類。
隨著項(xiàng)目越來(lái)越大,使用OOP可能會(huì)有幫助,OOP代碼很容易維護(hù),容易理解和重用。這些就是軟件工程的基礎(chǔ)。在基于web的項(xiàng)目中應(yīng)用這些概念就成為將來(lái)網(wǎng)站成功的關(guān)鍵。
高級(jí)OOP技術(shù)
在看過(guò)基本的OOP概念后,我就可以向你展示更高級(jí)的技術(shù):
序列化(Serializing)
PHP不支持永久對(duì)象,在OOP中永久對(duì)象是可以在多個(gè)應(yīng)用的引用中保持狀態(tài)和功能的對(duì)象,這意味著擁有將對(duì)象保存到一個(gè)文件或數(shù)據(jù)庫(kù)中的能力,而且可以在以后裝入對(duì)象。這就是所謂的序列化機(jī)制。PHP 擁有序列化方法,它可以通過(guò)對(duì)象進(jìn)行調(diào)用,序列化方法可以返回對(duì)象的字符串表示。然而,序列化只保存了對(duì)象的成員數(shù)據(jù)而不包括方法。
在PHP4中,如果你將對(duì)象序列化到字符串$s中,然后釋放對(duì)象,接著反序列化對(duì)象到$obj,你可以繼續(xù)使用對(duì)象的方法!我不建議這樣去做,因?yàn)椋╝)文檔中沒(méi)有保證這種行為在以后的版本中仍然可以使用。(b) 這個(gè)可能導(dǎo)致一種誤解,在你把一個(gè)序列化后的版本保存到磁盤(pán)并退出腳本時(shí)。當(dāng)以后運(yùn)行這個(gè)腳本時(shí),你不能期待著在反序列化一個(gè)對(duì)象時(shí),對(duì)象的方法也會(huì)在那里,因?yàn)樽址硎靖揪筒话ǚ椒ā?/p>
總而言之,PHP 進(jìn)行序列化對(duì)于保存對(duì)象的成員變量非常有用。(你也可以將相關(guān)數(shù)組和數(shù)組序列化到一個(gè)文件中)。
例子 ;
$obj=newClassfoo();
$str=serialize($obj);//保存$str到磁盤(pán)上
$obj2=unserialize($str);//幾個(gè)月以后//從磁盤(pán)中裝入str
你恢復(fù)了成員數(shù)據(jù),但是不包括方法(根據(jù)文檔所說(shuō))。這導(dǎo)致了只能通過(guò)類似于使用$obj2->x來(lái)存取成員變量(你沒(méi)有別的方法!)的唯一辦法,所以不要在家里試它。
有一些辦法可以解決這個(gè)問(wèn)題,我把它留著,因?yàn)閷?duì)這篇簡(jiǎn)潔的文章來(lái)說(shuō),他們太不好。我會(huì)很高興地歡迎在PHP的后續(xù)版本中有全序列化的特性。
使用類進(jìn)行數(shù)據(jù)存儲(chǔ)PHP和OOP一件非常好的事情就是,你可以很容易地定義一個(gè)類來(lái)操作某件事情,并且無(wú)論何時(shí)你想用的時(shí)候都可以調(diào)用相應(yīng)的類。假設(shè)你有一個(gè)HTML表單,用戶可以通過(guò)選擇產(chǎn)品ID號(hào)來(lái)選擇一個(gè)產(chǎn)品。在數(shù)據(jù)庫(kù)中有產(chǎn)品的信息,你想把產(chǎn)品顯示出來(lái),顯示它的價(jià)格等等。你擁有不同類型的產(chǎn)品,并且同一個(gè)動(dòng)作可能對(duì)不同的產(chǎn)品具有不同的意思。例如,顯示一個(gè)聲音可能意味著播放它,但是對(duì)于其它種類的產(chǎn)品可能意味著顯示一個(gè)存在數(shù)據(jù)庫(kù)中的圖片。你可以使用OOP或PHP來(lái)減少編碼并提高質(zhì)量:
定義一個(gè)產(chǎn)品的類,定義它應(yīng)該有的方法(例如:顯示),然后定義對(duì)每一種類型的產(chǎn)品的類,從產(chǎn)品類派后出來(lái)(SoundItem類,ViewableItem類,等等),覆蓋在產(chǎn)品類中的方法,使它們按你的想法動(dòng)作。
根據(jù)數(shù)據(jù)庫(kù)中每一種產(chǎn)品的類型(type)字段給類命名,一個(gè)典型的產(chǎn)品表可能有(id,type,price,description,等等字段)...然后在處理腳本中,你可以從數(shù)據(jù)庫(kù)中取出type值,然后實(shí)例化一個(gè)名為type的對(duì)象:
$obj=new$type();
$obj->action();
這是PHP的一個(gè)非常好的特性,你可以不用考慮對(duì)象的類型,調(diào)用$obj的顯示方法或其它的方法。使用這個(gè)技術(shù),你不需要修改腳本去增加一個(gè)新類型的對(duì)象,只是增加一個(gè)處理它的類。
這個(gè)功能很強(qiáng)大,只要定義方法,而不去考慮所有對(duì)象的類型,在不同的類中按不同的方法實(shí)現(xiàn)它們,然后在主腳本中對(duì)任意對(duì)象使用它們,沒(méi)有if...else,也不需要兩個(gè)程序員,只有高興。
你同意編程是容易的,維護(hù)是便宜的,可重用是真的嗎?
如果你管理一組程序員,分配工作就是很簡(jiǎn)單的了,每個(gè)人可能負(fù)責(zé)一個(gè)類型的對(duì)象和處理它的類。
可以通過(guò)這個(gè)技術(shù)實(shí)現(xiàn)國(guó)際化,根據(jù)用戶所選的語(yǔ)言字段應(yīng)用相應(yīng)的類就可以了,等等。
拷貝和克隆
當(dāng)你創(chuàng)建一個(gè)$obj的對(duì)象時(shí),你可以通過(guò)$obj2=$obj來(lái)拷貝對(duì)象,新的對(duì)象是$obj的一個(gè)拷貝(不是一個(gè)引用),所以它具有$obj在當(dāng)時(shí)的狀態(tài)。有時(shí)候,你不想這樣,你只是想生成一個(gè)象obj類一樣的一個(gè)新的對(duì)象,可以通過(guò)使用new語(yǔ)句來(lái)調(diào)用類的構(gòu)造函數(shù)。在PHP中也可以通過(guò)序列化,和一個(gè)基類來(lái)實(shí)現(xiàn),但所有的其它類都要從基類派生出來(lái)。
進(jìn)入危險(xiǎn)區(qū)域
當(dāng)你序列化一個(gè)對(duì)象,你會(huì)得到某種格式的字符串,如果你感興趣,你可以調(diào)究它,其中,字符串中有類的名字(太好了!),你可以把它取出來(lái),象:$herring=serialize($obj);
$vec=explode(':',$herring);//以:為標(biāo)識(shí)符把字符串拆分成一個(gè)數(shù)組
$nam=str_replace("\",'',$vec[2]);
所以假設(shè)你創(chuàng)建了一個(gè)"Universe"的類,并且強(qiáng)制所有的類都必須從universe擴(kuò)展,你可以在universe 中定義一個(gè)clone的方法,如下:
classUniverse{
//在新的PHP版本中克隆(__clone())是一個(gè)魔術(shù)方法,不要和這個(gè)方法搞混了
functionclone(){
$herring=serialize($this);
$vec=explode(':',$herring);
$nam=str_replace("\"",'',$vec[2]);
$ret=new$nam;
return$ret;
}
}//然后
$obj=newSomething();//從Universe擴(kuò)展
$other=$obj->clone();
你所得到的是一個(gè)新的Something類的對(duì)象,它同使用new方法,調(diào)用構(gòu)造函數(shù)創(chuàng)建出的對(duì)象一樣。我不知道這個(gè)對(duì)你是否有用,但是Universe類可以知道派生類的名字是一個(gè)好的經(jīng)驗(yàn)。想象是唯一的限制。
模板引擎
Smarty:Smarty的特點(diǎn)是將模板編譯成PHP腳本,然后執(zhí)行這些腳本。很快,非常方便。
Heyes Template Class:一個(gè)非常容易使用,但功能強(qiáng)大并且快速的模板引擎,它幫助你把頁(yè)面布局和設(shè)計(jì)從代碼中分離。
FastTemplate:一個(gè)簡(jiǎn)單的變量插值模板類,它分析你的模板,把變量的值從HTML代碼中分離處理。
ShellPage:一個(gè)簡(jiǎn)單易用的類,可以讓你的整個(gè)網(wǎng)站布局基于模板文件,修改模板就能改變整個(gè)站點(diǎn)。
STP Simple Template Parser:一個(gè)簡(jiǎn)單、輕量級(jí)并且易于使用的模板分析類。它可以從多個(gè)模板中組裝一個(gè)頁(yè)面,把結(jié)果頁(yè)面輸出到瀏覽器或者文件系統(tǒng)。
OO Template Class:一個(gè)你可以用在自己程序中的面向?qū)ο蟮哪0孱悺?/p>
SimpleTemplate:一個(gè)可以創(chuàng)建和結(jié)構(gòu)化網(wǎng)站的模板引擎。它可以解析和編譯模板。
bTemplate:短小但是快速的模板類,允許你把PHP邏輯代碼從HTML修飾代碼中分離。
Savant:一個(gè)強(qiáng)大且輕量級(jí)的PEAR兼容模板系統(tǒng)。它是非編譯型的,使用PHP語(yǔ)言本身做為它的模板語(yǔ)言。
ETS - easy template system:可以使用完全相同數(shù)據(jù)重組模板的模板系統(tǒng)。
EasyTemplatePHP:適用于你的站點(diǎn)的一個(gè)簡(jiǎn)單但是強(qiáng)大的模板系統(tǒng)。
vlibTemplate:一個(gè)快速、全能的模板系統(tǒng),它包含一個(gè)緩存和調(diào)試類。
AvanTemplate:多字節(jié)安全的模板引擎,占用很少系統(tǒng)資源。它支持變量替換,內(nèi)容塊可以設(shè)置顯示或隱藏
Grafx Software’s Fast Template:一個(gè)修改版本的Fast Template系統(tǒng),它包括緩存功能,調(diào)試控制臺(tái)以及沉默去除為賦值塊。
TemplatePower:一個(gè)快速、簡(jiǎn)單、功能強(qiáng)大的模板類。主要功能有嵌套的動(dòng)態(tài)塊支持,塊/文件包含支持以及顯示/隱藏未賦值的變量。
TagTemplate:這個(gè)庫(kù)的功能被設(shè)計(jì)來(lái)使用模板文件,同時(shí)允許你從HTML文件檢索信息。
htmltmpl: templating engine:一個(gè)適用于Python和PHP的模板引擎。它面向希望在項(xiàng)目中分離代碼和設(shè)計(jì)的web應(yīng)用開(kāi)發(fā)人員。
PHP Class for Parsing Dreamweaver templates:一個(gè)分析Dreamweaver模板的簡(jiǎn)單類,被用于Gallery 2 和WordPress的自定義模塊中。
MiniTemplator (Template Engine):針對(duì)HTML文件的一個(gè)緊湊型模板引擎。對(duì)于模板變量和塊定義它具有簡(jiǎn)單的語(yǔ)法。其中塊可以嵌套。
Layout Solution:簡(jiǎn)化網(wǎng)站開(kāi)發(fā)和維護(hù)。它擁有常用的變量和頁(yè)面元素使你不需要重復(fù)做頁(yè)面布局工作。
Cached Fast Template:它已經(jīng)納入 FastTemplate ,允許你緩存模板文件,甚至可以在分離的塊內(nèi)容上緩存不同的規(guī)格。
TinyButStrong:一個(gè)支持MySQL,Odbc,Sql-Server和ADODB的模板引擎。它包含7個(gè)方法和兩個(gè)屬性。
Brian Lozier’s php based template engine:只有2K大小,非常快并且是面向?qū)ο笤O(shè)計(jì)。
WACT:一個(gè)從設(shè)計(jì)中分離代碼的模板引擎。
PHPTAL:一個(gè)PHP下面的XML/XHTML模板庫(kù)。
Rong_View_Wudimei:Wudimei開(kāi)發(fā)的國(guó)產(chǎn)框架Rong Framework的模板引擎,它類似于smarty,優(yōu)點(diǎn)是速度快,缺點(diǎn)是模板標(biāo)簽較少,不過(guò)夠用了。
框架介紹thinkphp
ThinkPHP是一個(gè)免費(fèi)開(kāi)源的,快速、簡(jiǎn)單的面向?qū)ο蟮?輕量級(jí)PHP開(kāi)發(fā)框架 ,創(chuàng)立于2006年初,遵循Apache2開(kāi)源協(xié)議發(fā)布,是為了敏捷WEB應(yīng)用開(kāi)發(fā)和簡(jiǎn)化企業(yè)應(yīng)用開(kāi)發(fā)而誕生的。ThinkPHP從誕生以來(lái)一直秉承簡(jiǎn)潔實(shí)用的設(shè)計(jì)原則,在保持出色的性能和至簡(jiǎn)的代碼的同時(shí),也注重易用性。并且擁有眾多的原創(chuàng)功能和特性,在社區(qū)團(tuán)隊(duì)的積極參與下,在易用性、擴(kuò)展性和性能方面不斷優(yōu)化和改進(jìn),已經(jīng)成長(zhǎng)為國(guó)內(nèi)最領(lǐng)先和最具影響力的WEB應(yīng)用開(kāi)發(fā)框架,眾多的典型案例確保可以穩(wěn)定用于商業(yè)以及門(mén)戶級(jí)的開(kāi)發(fā)。
PHP認(rèn)證級(jí)別
PHP課程由初級(jí)(IFE)、中級(jí)(IPE)和高級(jí)(IAE)三個(gè)部分。
IFE即Index Front-end Engineer的縮寫(xiě),指數(shù)前端工程師的意思。
IPE即 Index PHP Engineer 的縮寫(xiě),意思是指數(shù)PHP工程師。
IAE即 Index architecture/advanced engineer 的縮寫(xiě),意思是:指數(shù)高級(jí)/架構(gòu)工程師。
PHP安全
PHP其實(shí)不過(guò)是Web服務(wù)器的一個(gè)模塊功能,所以首先要保證Web服務(wù)器的安全。當(dāng)然Web服務(wù)器要安全又必須是先保證系統(tǒng)安全,這樣就扯遠(yuǎn)了,無(wú)窮無(wú)盡。常見(jiàn)的web安全漏洞有:注入攻擊,跨站攻擊,服務(wù)器自身漏洞等,對(duì)應(yīng)的詳細(xì)解釋,詳見(jiàn):擴(kuò)展閱讀中的《WEB安全性-2010_OWASP_TOP10》,這里有很詳盡的解釋。
PHP的優(yōu)點(diǎn)學(xué)習(xí)過(guò)程和方法
PHP的語(yǔ)法類似于C,Perl,ASP或者JSP。對(duì)于那些對(duì)上述之一的語(yǔ)言較熟悉的人來(lái)說(shuō),PHP太簡(jiǎn)單了。相反的,如果你對(duì)PHP了解較多,那么你對(duì)于其他幾種語(yǔ)言的學(xué)習(xí)都很簡(jiǎn)單了。你只需要很短的時(shí)間內(nèi)將PHP的核心語(yǔ)言特點(diǎn)全部掌握,你可能已經(jīng)非常了解HTML,甚至你已經(jīng)知道怎樣用編輯設(shè)計(jì)軟件或者手工來(lái)制作好看的WEB站點(diǎn)。由于PHP代碼能夠無(wú)障礙的添加進(jìn)你的站點(diǎn),在你設(shè)計(jì)和維護(hù)站點(diǎn)的同時(shí),你可以很輕松的加入PHP使得你的站點(diǎn)更加具有動(dòng)態(tài)特性。
數(shù)據(jù)庫(kù)連接
PHP可以編譯成具有與許多數(shù)據(jù)庫(kù)相連接的函數(shù)。PHP與MySQL是絕佳的組合,如果再加上Apache服務(wù)器,就是相當(dāng)完美的了。你還可以自己編寫(xiě)外圍的函數(shù)取間接存取數(shù)據(jù)庫(kù)。通過(guò)這樣的途徑當(dāng)你更換使用的數(shù)據(jù)庫(kù)時(shí),可以輕松的更改編碼以適應(yīng)這樣的變化。PHPLIB就是最常用的可以提供一般事務(wù)需要的一系列基庫(kù)。
可擴(kuò)展性
就像前面說(shuō)的那樣,PHP已經(jīng)進(jìn)入了一個(gè)高速發(fā)展的時(shí)期。對(duì)于一個(gè)非程序員來(lái)說(shuō)為PHP擴(kuò)展附加功能可能會(huì)比較難,但是對(duì)于一個(gè)PHP程序員來(lái)說(shuō)并不困難。
PHP可伸縮性
傳統(tǒng)上網(wǎng)頁(yè)的交互作用是通過(guò)CGI來(lái)實(shí)現(xiàn)的。CGI程序的伸縮性不很理想,因?yàn)樗鼮槊恳粋€(gè)正在運(yùn)行的CGI程序開(kāi)一個(gè)獨(dú)立進(jìn)程。解決方法就是將經(jīng)常用來(lái)編寫(xiě)CGI程序的語(yǔ)
記事本保存php文件注意事項(xiàng)
記事本保存php文件注意事項(xiàng)
言的解釋器編譯進(jìn)你的web服務(wù)器(比如mod_perl,JSP)。PHP就可以以這種方式安裝,雖然很少有人愿意這樣以CGI方式安裝它。內(nèi)嵌的PHP可以具有更高的可伸縮性。
PHP免費(fèi)安裝
PHP源代碼包安裝版:這個(gè)版本適合已經(jīng)有自己獨(dú)立的網(wǎng)站域名、網(wǎng)站空間的專業(yè)網(wǎng)站建設(shè)用戶。使用方法依然其為簡(jiǎn)單,只需三步:
第一、到官方網(wǎng)站:下載 PHP源代碼包安裝版最新版本,解壓下載文件,將其中的全部?jī)?nèi)容上傳到你的支持PHP的網(wǎng)站空間
第二、改更文件屬性,請(qǐng)將根目錄下以PHP為后綴名的文件和”/include/domain.php”和 “/attachments” 和 “/data”文件夾以及文件夾下所有的文件屬性改成“可讀”、“可寫(xiě)”、“可執(zhí)行”,通常是“755”。
第三、打開(kāi)你的網(wǎng)站根目錄,系統(tǒng)會(huì)自動(dòng)運(yùn)行setup安裝程序,按提示點(diǎn)下一步操作即可。
友情提示:當(dāng)你下載我們的軟件并看到這份說(shuō)明時(shí),則說(shuō)明你一定是對(duì)企業(yè)網(wǎng)站建設(shè)有一定的需求或者你是一個(gè)網(wǎng)站建設(shè)技術(shù)學(xué)習(xí)者。
文件格式
對(duì)于只含有 php 代碼的文件,我們將在文件結(jié)尾處忽略掉 "?>"。這是為了防止多余的空格或者其它字符影響到代碼。
例如:
$foo = 'foo';
縮進(jìn)應(yīng)該能夠反映出代碼的邏輯結(jié)果,盡量使用四個(gè)空格,禁止使用制表符TAB,因?yàn)檫@樣能夠保證有跨客戶端編程器軟件的靈活性。
例如:if(1==$x){
$indented_code=1;
if(1==$new_line){
$more_indented_code=1;
}
}
變量賦值建議保持相等間距和排列。
例如:$variable='demo';
$var='demo2';
每行代碼長(zhǎng)度應(yīng)控制在80個(gè)字符以內(nèi),最長(zhǎng)不超過(guò)120個(gè)字符。因?yàn)?linux 讀入文件一般以80列為單位,就是說(shuō)如果一行代碼超過(guò)80個(gè)字符,那么系統(tǒng)將為此付出額外操作指令。這個(gè)雖然看起來(lái)是小問(wèn)題,但是對(duì)于追求完美的程序員來(lái)說(shuō)也是值得注意并遵守的規(guī)范。
每行結(jié)尾不允許有多余的空格。
Php文件記事本編輯亂碼問(wèn)題
一般情況下,記事本編輯器在對(duì)文件進(jìn)行完編輯并保存之時(shí),其默認(rèn)編碼為ANSI,中文。然則更多的時(shí)候,php在語(yǔ)言環(huán)境設(shè)置時(shí)語(yǔ)言多數(shù)為utf-8,直接保存并用于apache等http-server解析后就會(huì)出現(xiàn)亂碼。
為此,應(yīng)該注意在用記事本編輯完后可將文件用“另存為”的方式對(duì)文件進(jìn)行保存,并將“文件類型”選擇“所有文件”,編碼與文件指定語(yǔ)言編碼一致即可。[4]
算數(shù)運(yùn)算符
PHP 的運(yùn)算符包括算術(shù)運(yùn)算符、賦值運(yùn)算符、比較運(yùn)算符和邏輯運(yùn)算符。[5]
算數(shù)運(yùn)算符:
加,減,乘,除,取模(取余)
+、-、*、/、%
賦值運(yùn)算符:(以下解釋在許多書(shū)中有所不同)
賦值,加賦值,減賦值、乘賦值、除賦值,連字賦值
=、+=、-=、*=、/=、.=
位運(yùn)算符:
位與、位或、位亦或、位非、左移、右移
&、|、^、~、<<、>>
比較運(yùn)算符:
等于、全等于、不等于、不全等于、大于、小于、大于等于、小于等于
==、===、!=(<>)、!==、>、<、>=、<=
邏輯運(yùn)算符:
邏輯與、邏輯或、邏輯非、邏輯亦或
&&、||、!、xor
字符串運(yùn)算符:
. 連接兩個(gè)字符串