PHP面試題記錄

2022-09-09 21:24:42 字數 4798 閱讀 1905

注:難度不分先後,想起啥記錄啥。

1.單引號和雙引號區別

答:雙引號中的變數可以解析,單引號就是絕對的字串。

2.傳值和傳引用的區別

答:傳值:在函式範圍內,改變變數值得大小,都不不會影響到函式外邊的變數值。

大牛的解釋:

傳值:和copy是一樣的。【打個比方,我有一橦房子,我給你建築材料,你建了乙個根我的房子一模一樣的房子,你在你的房子做什麼事都不會影響到我,我在我的房子裡做什麼事也不會影響到你,彼此獨立。】

<?php

$testa=1; //定義變數a

$testb=2; //定義變數b

$testb = $testa; //變數a賦值給變數b

echo $testb; //顯示為1

?>

傳引用:類似於c語言的指標了,感覺差不多。打個比方,我有一橦房子,我給你一把鑰匙,我們二個都可以進入這個房子,你在房子做什麼都會影響到我。

<?php

$param2=1; //定義變數2

$param1 = &$param2; //將變數2的引用傳給變數1

echo $param2; //顯示為1

$param1 = 2; //把2賦值給變數1

echo $param2; //顯示為2

?>

【優缺點:】傳值會很耗時間,特別是對於大型的字串和物件來說,這將會是乙個代價很大的操作,傳送引用,函式內的任何操作等同於對傳送變數的操作,傳送大型變數時效率高!

3.mysql資料庫引擎myisam和innodb的區別

答:myisam

innodb

構成上的區別:

每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。

.frm檔案儲存表定義。

資料檔案的擴充套件名為.myd (mydata)。

索引檔案的副檔名是.myi (myindex)。

基於磁碟的資源是innodb表空間資料檔案和它的日誌檔案,innodb 表的大小只受限於作業系統檔案的大小,一般為 2gb

事務處理上方面:

myisam型別的表強調的是效能,其執行數度比innodb型別更快,但是不提供事務支援

innodb提供事務支援事務,外部鍵(foreign key)等高階資料庫功能

select   update,insertdelete操作

如果執行大量的select,myisam是更好的選擇

1.如果你的資料執行大量的insertupdate,出於效能方面的考慮,應該使用innodb表

2.delete   from table時,innodb不會重新建立表,而是一行一行的刪除。

3.load   table from master操作對innodb是不起作用的,解決方法是首先把innodb表改成myisam表,匯入資料後再改成innodb表,但是對於使用的額外的innodb特性(例如外來鍵)的表不適用

auto_increment的操作

每表乙個auto_incremen列的內部處理。

myisaminsertupdate操作自動更新這一列。這使得auto_increment列更快(至少10%)。在序列頂的值被刪除之後就不能再利用。(當auto_increment列被定義為多列索引的最後一列,可以出現重使用從序列頂部刪除的值的情況)。

auto_increment值可用alter table或myisamch來重置

對於auto_increment型別的字段,innodb中必須包含只有該字段的索引,但是在myisam表中,可以和其他字段一起建立聯合索引

更好和更快的auto_increment處理

如果你為乙個表指定auto_increment列,在資料詞典裡的innodb表控制代碼包含乙個名為自動增長計數器的計數器,它被用在為該列賦新值。

自動增長計數器僅被儲存在主記憶體中,而不是存在磁碟上

關於該計算器的演算法實現,請參考

auto_increment列在innodb裡如何工作

表的具體行數

select count(*) from table,myisam只要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含   where條件時,兩種表的操作是一樣的

innodb 中不儲存表的具體行數,也就是說,執行select count(*) from table時,innodb要掃瞄一遍整個表來計算有多少行

表鎖提供行鎖(locking on row level),提供與 oracle 型別一致的不加鎖讀取(non-locking read in

selects),另外,innodb表的行鎖也不是絕對的,如果在執行乙個sql語句時mysql不能確定要掃瞄的範圍,innodb表同樣會鎖全表, 例如update table set num=1 where name like "%aaa%"

4.物件、介面、抽象類

答:php 的物件的實現:

注:物件名稱最好以物件名.class.php來進行命名。

1. 對於靜態類的成員不能使用$this->這個來呼叫其靜態類的成員和函式,應該使用self::成員或者方法來進行呼叫;

2.對於繼承了靜態類的新類需要呼叫父類的靜態方法,應該採用parent::子類的靜態成員和方法來進行呼叫。

3.定義類常量的時候其用const來定義,不能用define來定義。使用也需要使用self::常量成員來訪問。

php的介面的實現:

1.介面的名字最好以l+介面名.php進行命名;

2.需要對介面的類進行每個的實現。

php 的抽象類的實現:

1.使用abstract關鍵字;

2.必須對抽象類的方法進行實現;

抽象類abstract

概念

定義為抽象的類不能被例項化。任何乙個類,如果有乙個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的類。

繼承乙個抽象類的時候,子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須喝父類中一樣或者更為寬鬆。

例如,某個抽象方法被宣告為proteced,那麼子類中的實現,就應該宣告為protected或者public,而不能定義為private。

方法的呼叫方式必須匹配,即型別和所需引數數量必須一致,例如,子類定義了乙個可選引數,而父類抽象方法中沒有宣告,則兩者的宣告並沒有衝突。

特點

介面inte***ce

概念

使用介面inte***ce,可以指定某個類必須實現那些方法,但是不需要定義這些方法的具體內容。

要實現乙個介面,使用implements操作符,類中必須實現介面中定義的所有方法。

特點

5.php常見設計模式

6.二分法演算法

1.遞迴演算法實現

/**

* @param array $arr 待查詢區間

* @param int $number 查詢數

* @param int $lower 區間最低點

* @param int $high 區間最高點

* @return int

*/function binary_search_recursion(&$arr, $number, $lower, $high)

if ($number > $arr[$middle]) elseif ($number < $arr[$middle]) else

}

2.非遞迴的演算法實現

/**

* 二分查詢演算法

* @param array $arr 待查詢區間

* @param int $number 查詢數

* @return int 返回找到的鍵

*/function binary_search($arr, $number)

// 初始變數值

$len = count($arr);

$lower = 0;

$high = $len - 1;

// 最低點比最高點大就退出

while ($lower <= $high) else if ($arr[$middle] < $number) else

}// 未找到,返回-1

return -1;

}

面試題記錄

面試題記錄 2012年6月13日杭州某網路技術公司 1,空指標自加 int p int pa null p pa p 求p的值 這道題考的貌似指標的加法,因為對於空指標比較敏感直接感覺有問題,所以填寫出錯.到底如何呢?直接反彙編之 int p int pa null 010d14f1 mov dwo...

面試題記錄

筆試面試題總結 1,var a 0 function a catch e 0 this.b bbb var aa new a settimeout function 0 settimeout的作用域是window,所以結果為1,2,bbb,b但是將 中的第二個settimeout去掉之後,結果為1,...

面試題記錄

1 linux實時檢視日誌 tail f catalina.out 2 linux檢視埠是否被占用 etstat tunlp grep 埠號,用於檢視指定埠號的程序情況 lsof i 80 3 linux查詢abc開頭的檔案的第一行輸出到指定檔案 system bin sh ls users zha...