PHP (超文本預(yù)處理器)

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è)字符串

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容