閉包的理解 |
內外兩個函數 外部函數執行完畢後 由於內部函數被外部函數引用着 導致其內部的變量繼續存活,而不是函數執行完畢後,立刻銷燬 |
閉包的代碼實現 |
function A(){ var count = 0; function B(){ count ++; console.log(count); } return B; } var C = A(); C();// 1 C();// 2 C();// 3 |
PHP內存回收機制 垃圾回收機制 引用計數器的理解 |
爲內存對象綁定計數器 當內存對象被引用時 +1操作 當內存對象被撤銷時 -1操作 當計數器等於0時 表明該內存對象沒有被引用 會進行垃圾回收
(回收,需要斷定變量有沒被使用) |
引用計數器使用過程中存在的問題
|
當兩個或兩個以上的對象互相引用形成環狀的時候,內存對象不會被銷燬。
但是,php5.3以後提供了同步週期算法來檢測環狀的存在,避免了這個問題 |
PHP內存溢出的解決方法 |
1)變量 變量用完後,及時銷燬 儘量少用靜態變量
2)對象 對象用完後及時析構 數據庫用完後及時關閉
3)數組 數組分批處理
4)內存 增加內存 |
Unset無法銷燬變量釋放內存的問題 |
1)變量佔用內存空間未到256字節
2)還有別的變量引用 |
單例模式原理 |
一個類中只有一個實例,並且可以自行實例化,向整個系統提供這個實例
可以節省資源 避免重複實例化 |
單例模式實現的代碼 (重點記憶) |
Class singleton{ Private Static $obj = null; Private function __constract(){} Private function __clone(){} Public static function getInstance(){ If( !is_object(self::$obj)){ Self::$obj = new self; } Return self::$obj; } } |
工廠模式 |
1)簡單工廠 2)工廠方法 3)抽象工廠
簡單工廠:只有一個工廠 工廠方法:每一個產品有對應的工廠 抽象工廠:多個產品的等級結構 |
觀察者模式 |
當一個對象的狀態發生改變時,其他的對象會全部收到通知,並且會自動跟新。 觀察者模式實現了低耦合,非侵入性的通知跟新機制
註冊 下訂單 警察來了,就通知各個走鬼趕緊逃 其中警察就是被觀察者,走鬼是觀察者 |
當前腳本的名稱(不包括路徑和問號後面的內容) |
$_SERVER[‘script_name’]
/index.php |
$_server['script_filename']
E:\WebSite\i.zglylx.com\index.php |
|
當前頁面的前一個頁面的URL地址 |
$_SERVER[‘http_referer’] |
當前腳本的絕對路徑 |
$_SERVER[‘http_host’] . $_SERVER[‘request_uri’] |
客戶端的IP地址 |
$_SERVER[‘remote_addr’] |
查詢的字符串(包括了問號後面的內容) |
$_SERVER[‘query_string’] |
當前運行的腳本所在的文檔根目錄 |
$_SERVER[‘document_root’]
E:\WebSite\i.zglylx.com |
%取模運算 |
$a % $b $a爲負值時,結果也是負值 |
Arsort |
Array_reverse_sort 對數組進行逆向排序並保持索引關係 |
去掉<script></script>標籤 |
/<script .*?>.*?</script>/si |
Apache添加php模塊 |
LoadModule php5_module ‘c://php/php5apache2.dll’ |
讓服務器識別PHP文件 |
AddType application/x-httpd-php.php |
是否開啓函數在調用時強制參數按照引用傳遞 |
Allow_call_time_pass_reference |
Php5和php7的區別 |
1)同一命名空間下的類,可以單use語句一次導入 2)魔術方法 __callstatic() __invoke() 3)trait靈活的代碼重用機制 4)匿名類 new class實例化匿名類 可用來替代用後即焚的類 5)快捷的三元運算符 6)太空船運算符 |
太空船運算符 |
$c = $a <=> $b; 1)$a > $b , $c = 1; 2)$a = $b , $c = 0; 3)$a < $b , $c = -1; |
Trait的代碼,實現代碼的重用 |
Trait HelloWorld{ Public function sayHello(){ Echo ‘hello world’; } }
Class theWorldIsNotEnough{ Use HelloWorld; Public function sayHello(){ Echo ‘hello universe!’; } }
$o = new theWorldIsNotEnough( ); $o->sayHello( ); // hello universe!
如果去掉裏面的sayHello方法,結果是: Hello world; 優先順序是當前類中的方法會覆蓋trait方法。 |
__invoke() |
當系統找不到方法時,就會自動調用這個方法 |
爲什麼php7比php5性能提升 |
1)減少了內存佔用 因爲變量存儲字節減少 2)改善數組結構 數組元素 hash映射表分到同一塊內存,減低內存佔用,提升了cpu緩存命中率 3)執行效率提高 優化了參數傳遞的環節 |
交換,不使用第三變量 |
1) $a = ‘12’; $b = ‘34’; $a = $a.$b $b = substr($a,0,strlen($a)-strlen($b)) $a = substr($a,strlen($b)); 2) list($a,$b) = array($b,$a); 3) $a=’12’; $b=’34’; $b=$a.’#’.$b; $b=explode(‘#’,$b); $a=$b[1]; $b=$b[0]; |
JS可否定義二維數組 |
不可以,但可以模擬 Arr[0] = new array(); |
Referance && 正規變量 |
1)傳遞的是變量的地址,一旦變量發生改變,整個應用都可見
2)正規變量,傳遞的是數據的值 |
在現執行的腳本中插入函數庫,插入PHP函數庫 |
Require include |
PHP定義字符串的方式有哪些 |
1)單引號 2)雙引號 3)Heredoc(雙引號) 4)Nowdoc(單引號)
Heredoc 的結束標記不能包含任何其他的字符,除了“;” |
單雙引號的區別 |
1)雙引號會替換變量的值,單引號會當做字符串輸出 2)轉義的支持不相同 3)性能速度問題,由於雙引號的字符串需要檢測是否含有$符號,單引號性能上更好
單 \’ => ‘ \”=>\” \\=>\ \n=>\n \r=>\r \$=>\$ 雙 \’=>\’ \\=>\ \n=> \r=> \$=>$
|
如何獲取和修改字符串的字符 |
可以通過字符串函數 |
什麼是位,字節,字符 |
位: 二進制中最小的信息單位
字節: 把字分成一節節 計算機存儲容量的計量單位
字符: 符號 計算機中使用的字母,數字,漢字 |
轉換字符串編碼 |
//將字符串string 編碼由utf8轉變成gbk iconv("utf8","gbk",$string)
//設置字符的編碼是utp-8 mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK"); |
正則表達式的引擎有哪些,區別是 |
DFA 文本導向的引擎,不要求回溯,永不測試相同的字符串2次
NFA 運行的是貪婪的回溯匹配算法,會反覆測試字符串,找到所有的擴展 |
如何測試一個正則表達式的性能 |
|
正則表達式的優化 |
使用正確的邊界匹配符(^ $) 使用正確的元字符(w d) 使用正確的量詞(+ *) |
Preg_match && preg_match_all |
preg_match($pattern, $subject, $matches); print_r($matches); |
Preg_replace Preg_replace_all |
|
Preg_split |
|
Preg_grep |
|
貪婪 懶惰 |
貪婪: 儘可能多
懶惰: 儘可能少,在後面有一個‘?’ |
|
|
php基礎知識(一)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.