66. 什么是OOP?什么是類和對象?什么是類屬性?
OOP(object oriented programming),即面向對象編程,其中兩個最重要的概念就是類和對象。
世間萬物都具有自身的屬性和方法,通過這些屬性和方法可以區分出不同的物質。
屬性和方法的集合就形成了類,類是面向對象編程的核心和基礎,
通過類就將零散的用於實現某個功能的代碼有效地管理起來了。
類只是具備了某些功能和屬性的抽象模型,而實際應用中需要一個一個實體,也就是需要對類進行實例化,
類在實例化之后就是對象。★類是對象的抽象概念,對象是類的實例化。
OOP具有三大特點:1. 封裝性(又叫做隱藏性);2. 繼承性; 3. 多態性。
OOP的優點:1、代碼重用性高(省代碼) 2、使程序的可維護性高(擴展性) 3、靈活性
67. 常用的屬性的訪問修飾符有哪些?分別代表什么含義?
private,protected,public。
類外:public ,var
子類中:public,protected ,var
本類中:private,protected,public ,var
如果不使用這三個關鍵詞,也可以使用var關鍵字。但是var不可以跟權限修飾詞一起使用。var定義的變量,子類中可以訪問到,類外也可以訪問到,相當於public
類前面:只能加final,abstract
屬性前面:必須有訪問修飾符(private,protected,public,var)
方法前面:static,final,private,protected,public ,abstract
68. $this和self、parent這三個關鍵詞分別代表什么?在哪些場合下使用?
$this 當前對象
self 當前類
parent 當前類的父類
$this在當前類中使用,使用->調用屬性和方法。
self也在當前類中使用,不過需要使用::調用。
parent在類中使用。
69.類中如何定義常量、如何類中調用常量、如何在類外調用常量。
類中的常量也就是成員常量,常量就是不會改變的量,是一個恆值。
定義常量使用關鍵字const.
例如:const PI = 3.1415326;
無論是類內還是類外,常量的訪問和變量是不一樣的,常量不需要實例化對象,
訪問常量的格式都是類名加作用域操作符號(雙冒號)來調用。
即:類名 :: 類常量名;
70. 作用域操作符::如何使用?都在哪些場合下使用?
調用類常量
調用靜態方法
71. 什么是魔術方法?常用的魔術方法有哪幾個?
以__開頭的系統自定義的方法。
__construct()
__destruct()
__autoload()
__call()
__tostring()
72. 什么是構造方法和析構方法?
構造方法就是在實例化一個對象的同時自動執行的成員方法,作用就是初始化對象。
php5之前,一個跟類名完全相同的方法是構造方法,php5之后魔術方法__construct()就是構造方法。
如果類中沒有定義構造方法,那么php會自動生成一個,這個自動生成的構造方法沒有任何參數,
沒有任何操作。
構造方法的格式如下:
function __construct(){}
或者:function 類名(){}
構造方法可以沒有參數,也可以有多個參數。
析構方法的作用和構造方法正好相反,是對象被銷毀時被自動調用的,作用是釋放內存。
析構方法的定義方法為:__destruct();
因為php具有垃圾回收機制,能自動清除不再使用的對象,釋放內存,一般情況下可以不手動創建析構方法。
73. __autoload()方法的工作原理是什么?
使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。
當程序執行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執行__autoload()函數。
這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后
就執行include或者require來載入該類,然后程序繼續執行,如果這個路徑下不存在該文件時就提示錯誤。
使用自動載入的魔術函數可以不必要寫很多個include或者require函數。
74. 什么是抽象類和接口?抽象類和接口有什么不同和相似的地方?
抽象類是一種不能被實例化的類,只能作為其他類的父類來使用。
抽象類是通過關鍵字 abstract 來聲明的。
抽象類與普通類相似,都包含成員變量和成員方法,兩者的區別在於,抽象類中至少要包含一個抽象方法,
抽象方法沒有方法體,該方法天生就是要被子類重寫的。
抽象方法的格式為:abstract function abstractMethod();
因為php中只支持單繼承,如果想實現多重繼承,就要使用接口。也就是說子類可以實現多個接口。
接口類是通過interface關鍵字來聲明的,接口類中的成員變量和方法都是public的,方法可以不寫關鍵字public,
接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現的。
抽象類和接口實現的功能十分相似,最大的不同是接口能實現多繼承。在應用中選擇抽象類還是接口要看具體實現。
子類繼承抽象類使用extends,子類實現接口使用implements。
抽象類至少有一個抽象方法嗎??????
答:如果一個類聲明成抽象類,里面可以沒有抽象方法
如果一個類中有抽象方法,這個類必須是抽象類
75. __call的參數有幾個,類型是什么,意義是什么?
魔術方法__call()的作用是當程序調用一個不存在或不可見的成員方法時,php會先調用__call()方法,
將那個不存在的方法的方法名和參數都存儲下來。
__call()包含兩個參數, 第一個參數是那個不存在的方法的方法名,是個字符串類型;
第二個參數是那個不存在的方法的所有參數,是個數組類型。
本人認為__call()方法的意義更多在於調試,可以定位到錯誤。同時可以捕捉異常,如果某個方法不存在,
則執行其它可替代方法。
76. smarty模板技術的用途是什么?
為了php與html分開,美工和程序員各司其職,互不干擾。
77. smarty配置主要有哪幾項?
1. 引入smarty.class.php;
2. 實例化smarty對象;
3. 重新修改默認的模板路徑;
4. 重新修改默認的編譯后文件的路徑;
5. 重新修改默認的配置文件的路徑;
6. 重新修改默認的cache的路徑。
7. 可以設置是否開啟cache。
8. 可以設置左側和右側定界符。
78. smarty在使用過程中需要注意哪些細節?
Smarty是基於MVC概念的一種模板引擎,它將一個頁面程序分成了兩部分來實現:即視圖層和控制層,
也就是說smarty技術將用戶UI與php代碼分離開。
這樣程序員和美工各司其職,互不干擾。
smarty運用過程中要注意以下幾個問題:
1.正確配置smarty。主要要實例化smarty對象,配置smarty模板文件的路徑;
2.php頁面中使用assign賦值 和 display顯示頁面;
3.smarty模板文件中不允許出現php代碼段,所有的注釋,變量,函數都要包含在定界符內。
A.{}
B. foreach
C. if else
D. include
E. literal
79. MVC的概念是什么?各層主要做什么工作?
MVC(即模型-視圖-控制器)是一種軟件設計模式或者說編程思想。
M指Model模型層,V是View視圖層(顯示層或者用戶界面),C是Controller控制器層。
使用mvc的目的是實現M和V分離,從而使得一個程序可以輕松使用不同的用戶界面。
在網站開發中,
模型層一般負責對數據庫表信息進行增刪改查,
視圖層負責顯示頁面內容,
控制器層在M和V之間起到調節作用,控制器層決定調用哪個model類的哪個方法,
執行完畢后由控制器層決定將結果assign到哪個view層。
80. oop中的多態性跟方法重寫有什么關系?
答:
81. java語言中方法重寫和重載分別代表什么意思?准確說php支持方法的重載嗎?很多參考書中提到的php重載實際上該如何正確理解?
答:
php不支持方法的重載,很多書里提到的PHP‘重載’應該是‘重寫’
82. final關鍵字能定義類中的成員屬性嗎?
答:不能,類的成員屬性只能有public ,private , protected ,var 來定義
83. final關鍵字定義的類能夠被繼承嗎?
答:final定義的類不能被繼承
84. 說說static關鍵字的使用場合?static能用在class前嗎?
static可以跟public,protected,private一起使用嗎?構造方法可以是static的嗎?
答: static可以在屬性和方法前面使用,調用static屬性或者方法時,只要將類載入就可用,不用實例化
static不能用在class的前面
static可以跟public,protected,private一起使用,在方法的前面;
▲構造方法不能是static
85. 接口可以實例化嗎?抽象類能實例化嗎?
答:接口和抽象類都不能被實例化
86. class前面能加訪問修飾符嗎?如果能加,只能是哪幾個訪問修飾符?可以是權限訪問修飾符public,protected,private嗎?
答:class前面可以加final,static;
★class前面不能加public,protected,private
87. 類中屬性前可以不加訪問修飾符嗎?成員變量前的修飾符只能是public,protected,private嗎?還可以是哪幾個?
答:類中的屬性必須加修飾符,除了那3個以外,還可以加var
88. 如果echo一個數組,頁面輸出什么?echo一個對象呢?print一個數組或者對象呢?
答:頁面只能輸出“Array”;echo一個對象會出現“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33”
print一個數組時也只是輸出“Array”,print一個對象出現“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php ”
▲print和echo是一樣的
89. __tostring()魔術方法在什么時候被自動執行? __tostring()魔術方法必須要return返回值嗎?
當echo或者print一個對象時,就是自動觸發。而且__tostring()必須要返回一個值
90. 什么是抽象方法?
答:在方法前面有abstract,而且方法沒有方法體,連“{ }”也不能有
91. 如果一個類中有一個方法是抽象方法,而這個類沒有定義成抽象類,會報錯嗎?
答:會,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"
92. 如果一個類是抽象類,而類中的方法都是非抽象的方法,會報錯嗎?
答:不會報錯,如果一個類是抽象類,其中可以沒有抽象方法,但是一個類中有個方法是抽象方法,那么這個類一定是一個抽象類
94. final 關鍵字的應用應注意的問題?
使用final關鍵字定義的類,禁止繼承。
使用final關鍵字定義的方法,禁止重寫。
95. 如果一個類既要繼承一個父類,又要實現多個接口,該如何寫?
書寫格式例如: class MaleHuman extends Human implements Animal,Life { ... }
96. 什么是單點入口呢?
所謂單點入口就是整個應用程序只有一個入口,所有的實現都通過這個入口來轉發,
比如說在上面我們就使用index.php作為程序的單點入口,當然這個是可以由你自己任意控制的。
單點入口有幾大好處:
第一、一些系統全局處理的變量,類,方法都可以在這里進行處理。比如說你要對數據進行初步的過濾,你要模擬session處理,你要定義一些全局變量,甚至你要注冊一些對象或者變量到注冊器里面
第二、程序的架構更加清晰明了。
97. PHP提供了2套正則表達式函數庫,分別是哪兩套?【
(1) PCRE Perl兼容正則表達式 preg_ 為前綴
(2) POSIX 便攜式的操作系統接口 ereg_ 為前綴
98. 正則表達式的組成?
由原子(普通字符,如英文字符)、
元字符(有特殊功用的字符)
模式修正字符
一個正則表達式中,至少包含一個原子
99. 不常用魔術方法的觸發時機?
__isset() __unset()的觸發時機
__sleep()、 __wakeup() 在對對象進行串行化的時候調用
如果序列化對象的時候,不寫__sleep()方法,則所有的成員屬性都會被序列化,而定義了__sleep()方法,則只序列化指定數組中的變量。
因此,如果有非常大的對象而並不需要完全儲存下來時此函數也很有用。
使用 __sleep 的目的是關閉對象可能具有的任何數據庫連接,提交等待中的數據或進行類似的清除任務。此外,如果有非常大的對象而並不需要完全儲存下來時此函數也很有用。
使用 __wakeup 的目的是重建在序列化中可能丟失的任何數據庫連接以及處理其它重新初始化的任務。
100. OOP的三大特性是什么?
1. 封裝性:
也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。
於是開發人員只需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,
實現代碼模塊間松藕合。
2. 繼承性:
就是子類自動繼承其父級類中的屬性和方法,並可以可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。
php只支持單繼承,也就是說一個子類只能有一個父類。
3. 多態性:
子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。
於是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。
多態性增強了軟件的靈活性。
101.常見框架
thinkPHP
yii
ZendFramework
CakePhp
sy
102. 常用魔術方法的觸發時機?
1)__autoload() :當程序實例化某個類,而該類沒有在當前文件中被引入。此時會觸發執行__autoload()。程序希望通過該方法,自動引入這個類文件。該方法有一個參數,即就是那個忘記引入的類的名稱。__autoload()方法的工作原理是什么?當程序執行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執行__autoload()函數。這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后,就執行include或者require來載入該類,然后程序繼續執行,如果這個路徑下不存在該文件時就提示錯誤。使用自動載入的魔術函數可以不必要寫很多個include或者require函數。
2)__construct() :這個是魔術構造方法。構造方法是實例化對象的時候自動執行的方法,作用就是初始化對象。該方法可以沒有參數,也可以有多個參數。如果有參數,那么new這個對象的時候要記得寫上相應的參數。在php5以前,沒有魔術構造方法,普通構造方法是一個跟類名同名的方法來實現構造的。如果一個類中既寫了魔術構造方法,又定義了普通構造方法。那么php5以上版本中,魔術方法起作用,普通構造方法不起作用。反之,在php5以前版本中,不認識魔術構造方法,只是把該方法當做普通的方法。
3)__destruct() :這個是魔術析構方法。析構方法的作用和構造方法正好相反,是對象被銷毀時被自動調用的,作用是釋放內存。析構方法沒有參數。
4)__call() :當程序調用一個不存在或不可見的成員方法時,自動觸發執行__call()。它有兩個參數,分別是未訪問到的方法名稱和方法的參數。而第二個參數是數組類型。
5)__get() :當程序調用一個未定義或不可見的成員屬性時,自動觸發執行__get()。它有一個參數,表示要調用的屬性的名稱。
6)__set():當程序試圖寫入一個不存在或不可見的成員屬性時,PHP就會自動執行__set()。它包含兩個參數,分別表示屬性名稱和屬性值。
7)__tostring() :當程序使用echo或print輸出對象時,會自動調用該方法。目的是希望通過該方法將對象轉化為字符串,再輸出。__tostring() 無參數,但是該方法必須有返回值。
8)__clone() :當程序clone一個對象的時候,能觸發__clone()方法,程序希望通過這個魔術方法實現:不僅僅單純地克隆對象,還需要克隆出來的對象擁有原來對象的所有屬性和方法。
103. MVC的概念是什么?
MVC(即模型-視圖-控制器)是80年代發明的一種軟件設計模式或者說編程思想。
M指模型層,V是指視圖層(顯示層或者用戶界面),C是指控制層。
使用mvc的目的是實現M和V分離,從而使得一個程序可以輕松使用不同的用戶界面。
C存在的目的則是在M和V之間起到調節作用,確保M和V的同步,一旦M改變,V應該能同步更新。
將M和V分離,就可以做到同一個網頁,在不同節日到來的時候能顯示不同的頁面風格,這只需要提前制作多個視圖層模板頁面,
而無需更改M層程序。
MVC做到了編程中的分工合作,代碼的可重用性得到最大化體現,程序邏輯更加清晰而富有條理,便於后期維護管理。
104、 訪問權限修飾符有哪幾種,對比解釋
答:1、public 表示公共的,在本類中和子類中以及類外,可以對其調用
2、protected表示受保護的,可以在本類中和子類中調用
3、private表示私有的,只能在本類中調用
4、var,效果等同於public
105、 Class關鍵詞前可以有哪些修飾詞
a) Final修飾,表示該類是最終的,無法繼承
b) Abstract修飾,表示該類是抽象類
106、 作用域操作符在那些場合下使用
答:作用於操作符的使用場合
a) 本類中:
i. self::類常量
ii. self::靜態屬性
iii. self::方法() parent::方法()
b) 子類中:
i. parent::類常量
ii. parent::靜態屬性(public或者protected)
iii. parent::方法()(public或者protected)
c) 類外:
i. 類名::類常量
ii. 類名::靜態屬性(public)
iii. 類名::靜態方法(public)
107、 $this,self, parent分別代表什么?哪些場合下使用
答:$this代表的是當前對象
self代表的是當前的類
parent代表的是當前類的父類
使用場合:
$this只能使用在當前類中,通過$this->可以調用當前類中的屬性和方法;
self只能在當前類中使用,通過作用域操作符::訪問當前類中的類常量、當前類中的靜態屬性、當前類中的方法;
parent只能使用在有父類的當前類中,通過作用域操作符::訪問父類中的類常量、父類中的靜態屬性、父類中的方法。
108、 說明是接口、抽象類二者有何相同和不同的地方?
1、接口是幫助php實現功能意義上的多繼承的,用interface來聲明,其方法沒有方法體,使用implemens關鍵詞來實現接口。
接口中只能包含抽象方法和類常量,不可以包含成員屬性。
2、抽象類是一種不能被實例化的類,只能作父類,用abstract class來定義,抽象類和普通類可以沒有區別,類中可以包含成員屬性、類常量、方法。
子類得用extends來繼承,而且只能是單繼承。
兩者相同點是都不可以被實例化,都是需要被繼承才可以使用。
兩者的最大區別是接口可以實現多繼承,而抽象類只能是單繼承。
接口中不能包含成員屬性,而抽象類中可以有成員屬性。
接口中的抽象方法必須是public或者無訪問修飾詞,接口中的抽象方法不能用abstract來修飾。
抽象類中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract來修飾。
109、 解釋PHP中單例模式?
又叫做單態模式、單元素模式、singleton pattern。
單例模式指在PHP的應用程序的范圍內只對指定的類創建一個實例。使用單例模式的類稱為單例類。
在php中單例類必須要有一個私有的構造方法,還要有一個私有的魔術克隆方法(該方法體中為空)
和一個私有的靜態的成員屬性$_instance.
私有構造方法防止除自身以外的類來實例化它。私有的方法體為空的克隆方法防止該類被克隆。
$_instance用來存儲被自身實例化后的對象。
還必須要有一個公共的靜態的方法getInstance()。該方法返回已經存儲了實例對象的$_instance。
110、 什么是SQL注入?
SQL注入攻擊是黑客對數據庫進行攻擊的常用手段之一。一部分程序員在編寫代碼的時候,
沒有對用戶輸入數據的合法性進行判斷,注入者可以在表單中輸入一段數據庫查詢代碼並提交,
程序將提交的信息拼湊生成一個完整sql語句,服務器被欺騙而執行該條惡意的SQL命令。注入者根據程序返回的結果,
成功獲取一些敏感數據,甚至控制整個服務器,這就是SQL注入。
111、 如何防止SQL注入?
要對提交的信息進行過濾,對單引號進行轉義。
首先可以在php.ini中設置,讓所有的單引號在提交后都進行轉義。或者使用addslashes().
112、 FCKEditor自動過濾的解決辦法?
如果您需要編輯模板頁,默認的FCK設置是會去掉<HTML></HTML><BODY></BODY>標簽,而且會給你加上<P></P>標簽的,如果需要保留的話,只要更改下設置可以了。
在fckconfig.js里面有:FCKConfig.FullPage = false ;
改為:FCKConfig.FullPage = true;
如果想去掉自動添加<P>的代碼就可以在這里設置
默認是
FCKConfig.EnterMode = 'p' ; // p | div | br
FCKConfig.ShiftEnterMode = 'br' ; // p | div | br
改成
FCKConfig.EnterMode = 'br' ; // p | div | br
FCKConfig.ShiftEnterMode = 'p' ; // p | div | br
113、 $_REQUEST、$_GET、$_POST、$_COOKIE 的關系和區別:
1.關系:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的所有內容,是它們的集合體。
2.通過$_REQUEST獲取變量值,PHP頁面因為不確定它是哪種傳值方式,
因此會根據php.ini中的配置來接收值。
php.ini里可以設置,variables_order = “GPC”。其含義是GET,POST,COOKIE.
所以PHP頁面會先從$_GET中獲取,再從$_POST中獲取,然后從$_COOKIE中獲取。
新獲得的值會覆蓋之前獲取到的值。
因此從表現形式上看,$_REQUEST最后是獲取$_COOKIE中的值,如果$_COOKIE中沒有值,
會獲取$_POST中的值,如果$_POST沒有獲取到 ,就去$_GET中獲取。
如果$_GET中也沒有該值,那么$_REQUEST就返回null。
114、 什么是多條件查詢(復合查詢),如何實現多條件查詢?
如何實現萬能查詢呢?查詢的時候要填寫查詢條件,這些條件會通過表單進行提交。
首先需要檢查提交的條件是否為空。如果不為空,就認為這個值是要被當作條件,
我們就可以使用字符串連接的方式來組合一個sql查詢語句。
當執行后獲取查詢結果。
115. 文件上傳需要注意哪些細節?怎么把文件保存到指定目錄?怎么避免上傳文件重名問題?
1). 首現要在php.ini中開啟文件上傳;
2). 在php.ini中有一個允許上傳的最大值,默認是2MB。必要的時候可以更改;
3). 上傳表單一定要記住在form標簽中寫上enctype="multipart/form-data";
4). 提交方式 method 必須是 post;
5). 設定 type="file" 的表單控件,並且必須具有name屬性值;
6). 為了上傳成功,必須保證上傳文件的大小是否超標、文件類型是否符合要求,上傳后存放的路徑是否存在;
7). 表單提交到接收頁面,接收頁面使用$_FILES來接收上傳的文件。
$_FILES是個多維數組。第一維下標是上傳控件的name,二維下標分別為name/type/tmp_name/size/error。分別代表
文件名、文件類型、上傳到臨時目錄下的臨時文件名、文件大小、是否有錯誤。
如果是批量上傳,那么二維下標就是數組,而並非是字符串。
8). 文件上傳后是被放置在服務器端臨時路徑下,需要使用move_uploaded_file ()函數,才可以將上傳后的
文件保存到指定目錄。
9). 為了避免上傳文件重名,可以通過上傳的文件名獲取到文件后綴,然后使用時間戳+文件后綴的方式為文件重新命名。
116. 使用GD2庫創建圖像的步驟?
1). 創建一個畫布:
imagecreate();
2). 設置畫布背景顏色,使用RGB設置顏色:
imagecolorallocate();
3). 設置文字顏色:
imagecolorallocate();
4). 在畫布上書寫文字:
imagestring();
5). 以 JPEG 格式將圖像輸出到瀏覽器或文件:【根據圖片格式不同,函數還可以是imagepng()、imagegif()等】
imagejpeg();
6). 清除圖像資源:
imagedestroy();
117. GD2庫生成縮略圖的步驟是什么?
1). 讀取希望生成縮略圖的源圖像,創建圖像對象:【根據圖片格式不同,函數也相應不同】
$src_image = imagecreatefromjpeg();
2). 獲取原圖像的寬度和高度$srcW,$srcH,根據縮放比例計算出新圖像的寬度和高度$dstW、$dstH:
3). 創建一個真色彩的圖像對象,寬度和高度設置成剛才計算出的寬度和高度:
$dst_image = imagecreatetruecolor($dstW,$dstH);
4). 拷貝圖像並調整大小:
imagecopyresized();
5). 將圖像輸出:【根據圖片格式不同,函數也相應不同】
imagejpeg();
6). 清除圖像資源(將源圖像資源和目標圖像資源都清除)
imagedestroy();
118. GD2庫給圖片增加水印如何做?
1. 添加簡單的文本水印:
利用imagestring()函數就可以在圖片上寫文本水印。
2. 增加一個圖形水印:
1). 讀取希望增加水印的源圖片,創建圖像對象:【根據圖片格式不同,函數也相應不同】
$image = imagecreatefromjpeg();
2). 創建一個水印圖片的圖像對象:
$watermark = imagecreatefrompng();
3). 拷貝並合並圖像:
imagecopymerge();
4). 將圖像輸出:【根據圖片格式不同,函數也相應不同】
imagejpeg();
5). 清除圖像資源(將源圖像資源和水印圖像資源都清除)
imagedestroy();
119. 什么是事務?什么是回滾?事務的作用是什么?
事務就是組合起來的幾個獨立的sql操作。如果其中一項失敗,那么就讓這幾個組合起來的sql操作都
回退到未執行狀態。這就是事務的回滾。
mysql中MyISAM存儲引擎的表不支持事務,只有InnoDB 存儲引擎的表才支持事務,為了讓事務正常執行,
就需要讓參與事務的所有數據表都設置成innoDB類型。
事務被包裝在了 BEGIN 和 COMMIT 語句之間。在沒有使用 COMMIT 語句的情況下,對數據庫的操作不是永久的,
一旦運行了 ROLLBACK,就會被回退。只有執行了COMMIT,數據表中的信息才被改動。
事務的目的就是為了保證數據的完整性。
120. 模擬SESSION機制實現數據庫存放會話數據有什么作用?【備用】
如果使用默認的SESSION機制,大家都知道默認的SESSION_ID是存放在COOKIE中,用戶的身份是靠SESSION_ID來識別的,
而COOKIE文件是存放在用戶瀏覽器的客戶端,這樣就會帶來一個問題,當用戶在辦公室選擇一些商品到購物車,
在准備下訂單付款的時候,用戶選擇了支付寶在線的支付方式,恰巧辦公室的電腦上面沒有安裝支付寶的數字證書,
而在用戶家里的電腦安裝過數字證書,所以呢,用戶就需要回家去支付。但是回家登錄商城之后,
發現購物車中精心挑選的商品都不存在了。這是為什么呢?問題就在家里電腦上的並沒有存放SESSION_ID的cookie文件,
因而就無法正確的讀取服務器上對應session文件中的數據,所以無法將原來的選擇的商品息讀取過來。
這樣的購物車功能給用戶的用戶體驗式非常糟糕的,所以我們就需要采取模擬SESSION機制使用數據庫來存放會話數據。
121. 什么是無限極分類?
要實現無限極分類,數據庫建表是關鍵。
表結構中至少需要三個字段,如果想避免遞歸循環,那么需要四個字段。
1. id ,當前數據的唯一標識;
2. typename ,類型名稱;
3. parentid , 當前類型的上一層父類型的id;
4. path , 其中存儲當前類型的id和它所有父級類型的id。
這些id之間采用“-”隔開。
5. 當通過以下sql語句就可以實現,相同頂級類下的信息都在一起集中顯示。
select * from 表名 where 條件 order by path;
122. 分頁原理是什么?
數據分頁需要以下幾個條件:
1. 參與分頁的總條數 【$msg_count】 ,該值通過數據庫查詢可以獲取到;
2. 每頁顯示的條數【$pagesize】 ,這個數值由自己定義;
3. 當前頁的頁碼數 【$page】,該數值通過地址欄傳遞和接收;
4. 可以通過以上資料計算出總頁數 【$pagecount】 ,此處需要借助ceil();
【$pagecount = ceil($msg_count/$pagesize);】
5. 數據庫查詢借助sql語句中的【limit】來實現數據的變化:
例如:
select * from 表名 where 條件 limit $startnum , $pagesize;
而$startnum = ($page-1)*$pagesize;
123、 如何在smarty模板語言中使用php代碼?
借助於兩個smarty內建函數。
1. inluce_php 函數用於在模板中包含 php 腳本。例如:
{include_php file="test.php"}
2. php 標簽允許在模板中直接嵌入 php 腳本。例如:
{php}
echo "這個是php內建函數的作用";
{/php}
124、 請列出至少五個smarty中的變量調節符並說明功能?
default 例如:{$arr|default:’xxxx’} ,默認變量調節器,當變量為空時顯示給定的默認值;
truncate 例如:{$articleTitle|truncate:10} , 切割字符串長度為指定的長度;
count_characters 例如:{$articleTitle|count_characters} ,獲取字符串長度;
strip_tags 例如: {$articleTitle|strip_tags} ,去除字符串中的所有html標簽;
date_format 例如:{$smarty.now|date_format(‘’)} ,格式化時間戳。
125、 寫程序實現如下功能:
a.如何判斷一個字符串中是否存在一個字符?
echo strstr('abcdefgcd' , 'cd');
echo strpos('ab0defgcd' , 'cd');
b.如何判斷一個字符串中一個字符出現的次數?
echo substr_count('abcdefgcd' , 'cd');
c.如何去掉一個字符串的最后一個字符
echo substr('abcdefgcd' , 0 , -1);
126、 如何使用smarty的緩存、步驟?什么叫單模板多緩存?
如果給整個網站開啟緩存,那么$smarty->caching=1,此時緩存的時間為smarty.class.php中默認的時間,也就是3600秒。
如果對每一個頁面獨立設置緩存,那么$smarty->caching=2 ,緩存時間就會跟display的參數模板頁相掛鈎,也就是可以實現對每個模板頁設置不同的緩存時間。
用法例如:
if(!$smarty->is_cached('index.html')) {
//此處可以執行數據庫操作
$smarty->cache_lifetime = 3600*6;
}
$smarty->display('index.html');
對於例如新聞單條這樣的頁面,新聞的模板都是一個,如果開啟緩存,那么所有的新聞單頁的緩存都是一個,根本不會隨着id的變化而變換內容。所以為了區分不同的頁面緩存,需要使用單模板多緩存技術。具體做法是以id作為display的第二個參數來實現。此外對於具有分頁的列表頁,也必須在display中使用第二個參數,可以使用新聞類型id和當前頁面合並成第二個參數。
127、 寫一個遞歸函數完成以下功能:向函數中傳一個多維數組,對數組中所有的值做判斷
,如果值是’number’則設置該值為0?(提示:該題考的是遞歸的應用,因為傳入的數組不確定是多少維的,所以需要遞歸判斷)
function recursive_array($arr) {
if(is_array($arr)) {
foreach($arr as $key=>$value) {
if(is_array($value)) {
$arr[$key] = recursive_array($value);
} else {
if($value=='number') {
$arr[$key] = '0'; }
}
}
}
return $arr;
}
128、 使用jquery寫一個全選的例子?
//全選與取消全選
function selectAll(flag) {
for(var i=0; i<$("#fonds input").size(); i++) {
$("#fonds input").get(i).checked=flag;
}
}
//判斷復選框已經被勾選了多少個?
function checkFonds() {
var count=0;
for(var i=0; i<$("#fonds input").size(); i++) {
if($("#fonds input").get(i).checked==true) {
count++;
}
}
alert(count);
}
//利用后代選擇器和get()來獲取指定的控件
$(“div a”).get(2)
129、 請說明smarty中fetch方法的功能?
Fetch方法可以獲取到頁面所有的內容,並且賦值到一個變量中。
如果第四個參數為true,則等同於display,直接輸出到瀏覽器中。
如果第四個參數為false,則不輸出。
Display方法就是第四個參數為true的fetch方法。
Display = Fetch() + echo()
130、 寫出關於文件上傳的相關函數?
strrchr($filename , '.');
explode('.' , $filename);
end($arr);
strrpos($filename , '.');
substr($filename , $pos+1);
pathinfo($filename , PATHINFO_EXTENSION);
date(‘YmdHis’)
time()
rand();
mt_rand()
move_uploaded_file()
131、 如何將SESSION存放在數據庫中,可以結合數據表設計說明.
默認情況下php.ini中session.save_handler = files,也就是session是以文件形 式存儲的。
如果想更改為數據庫或其它存儲方式,那么需要更改設置,讓 session.save_handler = user。
除了在php.ini中配置外,還可以在PHP頁面中單獨配置,用
ini_set ('session.save_handler, 'user')來設置session的存儲方式,設置為用戶自定義存儲方式。
設置好存儲方式后,需要使用session_set_save_handler()函數。
該函數是設置用戶級別的session保存過程的函數。該函數有6個參數,這6個參數其實是6個自定義函數的名稱,分別代表對session的開啟,關閉,讀,寫 ,銷毀,gc(垃圾回收)。
示例代碼如下:
function open () { }
function close() { }
function read () { }
function write () {}
function destroy () {}
function gc () {}
session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");
session_start();
現在你就可以象往常一樣地使用session了。
數據庫結構如下:
Session_id , session_value ,expire_time , 分別存儲sessionid的id和值以及失效時間。
132、 常用的正則表達式寫法:
中文:/^[\u4E00-\u9FA5]+$/
手機號碼:/^(86)?0?1\d{10}$/
EMAIL:
/^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/
密碼(安全級別中):
/^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/
密碼(安全級別高):
/^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/
