PHP
- 寫(xiě)一個(gè)email和手機(jī)號(hào)的正則表達(dá)式
$str = '123456@qq.com';
$pattern = "/^[a-zA-Z0-9-]+@[a-zA-Z0-9-]+(.[a-zA-Z0-9_-]+)+$/";
preg_match($pattern, $str, $match);
print_r($match['0']);
$str = '13299803211';
$pattern = "/^1(3|4|5|6|7|8|9)\d{9}$/";
preg_match($pattern, $str, $match);
print_r($match['0']);
foo()和@foo()之間有什么區(qū)別?
參考答案:
@代表所有warning忽略請(qǐng)說(shuō)明 PHP 中傳值與傳引用的區(qū)別。什么時(shí)候傳值什么時(shí)候傳引用撬呢?
參考答案:
按值傳遞:函數(shù)范圍內(nèi)對(duì)值的任何改變?cè)诤瘮?shù)外部都會(huì)被忽略 按引用傳遞:函數(shù)范圍內(nèi)對(duì)值的任何改變?cè)诤瘮?shù)外部
也能反映出這些修改 優(yōu)缺點(diǎn):按值傳遞時(shí)妆兑,php必須復(fù)制值。特別是對(duì)于大型的字符串和數(shù)組和對(duì)象來(lái)說(shuō)芯勘,這將會(huì)是
一個(gè)代價(jià)很大的操作腺逛。按引用傳遞則不需要復(fù)制值荷愕,對(duì)于性能提高很有好處安疗。TCP怎么建立連接?
參考答案:
TCP是因特網(wǎng)中的傳輸層協(xié)議,使用三次握手協(xié)議建立連接怖现。當(dāng)主動(dòng)方發(fā)出SYN連接請(qǐng)求后玉罐,等待對(duì)方回答SYN屈嗤, ACK恢共。這種建立連接的方法可以防止產(chǎn)生錯(cuò)誤的連接璧亚,TCP使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議。第一次
握手:建立連接時(shí)癣蟋,客戶端發(fā)送SYN包(SEQ=x)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài)疯搅,等待服務(wù)器確認(rèn)。第二次握手:
服務(wù)器收到SYN包罪治,必須確認(rèn)客戶的SYN(ACK=x+1),同時(shí)自己也送一個(gè)SYN包(SEQ=y),即SYN+ACK包礁蔗,此時(shí)服務(wù)器進(jìn)
入SYN_RECV狀態(tài)。第三次握手:客戶端收到服務(wù)器的SYN+ACK包浴井,向服務(wù)器發(fā)送確認(rèn)包ACK(ACK=y+1),此包發(fā)送完
畢,客戶端和服務(wù)器時(shí)入Established狀態(tài)洪囤,完成三次握手撕氧。常用的魔術(shù)方法有哪些?舉例說(shuō)明(靠記)
參考答案:
__construct() 實(shí)例化類(lèi)時(shí)自動(dòng)調(diào)用伦泥。
__destruct() 類(lèi)對(duì)象使用結(jié)束時(shí)自動(dòng)調(diào)用何暮。
__set() 在給未定義的屬性賦值的時(shí)候調(diào)用铐殃。
__get() 調(diào)用未定義的屬性時(shí)候調(diào)用跨新。
__isset() 使用isset()或empty()函數(shù)時(shí)候會(huì)調(diào)用。
__unset() 使用unset()時(shí)候會(huì)調(diào)用赘被。
__sleep() 使用serialize序列化時(shí)候調(diào)用肖揣。
__wakeup() 使用unserialize反序列化的時(shí)候調(diào)用民假。
__call() 調(diào)用一個(gè)不存在的方法的時(shí)候調(diào)用龙优。
__callStatic()調(diào)用一個(gè)不存在的靜態(tài)方法是調(diào)用。
__toString() 把對(duì)象轉(zhuǎn)換成字符串的時(shí)候會(huì)調(diào)用彤断。比如 echo。
__invoke() 當(dāng)嘗試把對(duì)象當(dāng)方法調(diào)用時(shí)調(diào)用平道。
__set_state() 當(dāng)使用var_export()函數(shù)時(shí)候調(diào)用供炼。接受一個(gè)數(shù)組參數(shù)。
__clone() 當(dāng)使用clone復(fù)制一個(gè)對(duì)象時(shí)候調(diào)用袋哼。
session與cookie的區(qū)別?
參考答案:
1、cookie數(shù)據(jù)存放在第三方應(yīng)用的瀏覽器上轧苫,session數(shù)據(jù)放在服務(wù)器上疫蔓。
2、cookie不是很安全衅胀,別人可以分析存放在本地的COOKIE,進(jìn)行COOKIE欺騙,考慮到安全應(yīng)當(dāng)使用session雏门。
3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上茁影。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方
面募闲,應(yīng)當(dāng)使用COOKIE。
4靴患、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K要出,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
5患蹂、所以個(gè)人建議: 將登陸信息等重要信息存放為SESSION 其他信息如果需要保留或颊,可以放在COOKIE請(qǐng)說(shuō)說(shuō)對(duì)php中final 關(guān)鍵字的理解
參考答案:
PHP 5 新增了一個(gè) final 關(guān)鍵字。如果父類(lèi)中的方法被聲明為 final况脆,則子類(lèi)無(wú)法覆蓋該方法饭宾。如果一個(gè)類(lèi)被聲明為
final,則不能被繼承格了。你用過(guò)哪些PHP設(shè)計(jì)模式看铆?
參考答案:
1、工廠模式
建立一個(gè)工廠(一個(gè)函數(shù)或一個(gè)類(lèi)方法)來(lái)制造新的對(duì)象
工廠模式 是一種類(lèi)盛末,它具有為您創(chuàng)建對(duì)象的某些方法弹惦。您可以使用工廠類(lèi)創(chuàng)建對(duì)象,而不直接使用 new悄但。這樣棠隐,如
果您想要更改所創(chuàng)建的對(duì)象類(lèi)型,只需更改該工廠即可檐嚣。使用該工廠的所有代碼會(huì)自動(dòng)更改助泽。
2、單例模式
單例模式確保某個(gè)類(lèi)只有一個(gè)實(shí)例嚎京,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例嗡贺。
單例模式是一種常見(jiàn)的設(shè)計(jì)模式,在計(jì)算機(jī)系統(tǒng)中鞍帝,線程池帕涌、緩存、日志對(duì)象钦扭、對(duì)話框土全、打印機(jī)、數(shù)據(jù)庫(kù)操作瑞凑、顯卡
的驅(qū)動(dòng)程序常被設(shè)計(jì)成單例籽御。
單例模式分3種:懶漢式單例铃将、餓漢式單例哑梳、登記式單例悯仙。
單例模式有以下3個(gè)特點(diǎn):
1.只能有一個(gè)實(shí)例锡垄。
2.必須自行創(chuàng)建這個(gè)實(shí)例货岭。
3.必須給其他對(duì)象提供這一實(shí)例千贯。
那么為什么要使用PHP單例模式丈牢?
PHP一個(gè)主要應(yīng)用場(chǎng)合就是應(yīng)用程序與數(shù)據(jù)庫(kù)打交道的場(chǎng)景慌核,在一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作垮卓,針對(duì)數(shù)據(jù)庫(kù)句
柄連接數(shù)據(jù)庫(kù)的行為粟按,使用單例模式可以避免大量的new操作。因?yàn)槊恳淮蝞ew操作都會(huì)消耗系統(tǒng)和內(nèi)存的資源庙曙。
3浩淘、觀察者模式
1:觀察者模式(Observer)砂蔽,當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生變化時(shí)左驾,依賴(lài)它的對(duì)象全部會(huì)收到通知什荣,并自動(dòng)更新稻爬。 2:場(chǎng)景:一
個(gè)事件發(fā)生后桅锄,要執(zhí)行一連串更新操作友瘤。傳統(tǒng)的編程方式辫秧,就是在事件的代碼之后直接加入處理的邏輯绪妹。當(dāng)更新的邏
輯增多之后邮旷,代碼會(huì)變得難以維護(hù)婶肩。這種方式是耦合的,侵入式的苗膝,增加新的邏輯需要修改事件的主體代碼。 3:觀
察者模式實(shí)現(xiàn)了低耦合病附,非侵入式的通知與更新機(jī)制。 定義一個(gè)事件觸發(fā)抽象類(lèi)覆积。
4宽档、適配器模式
將各種截然不同的函數(shù)接口封裝成統(tǒng)一的API。 PHP中的數(shù)據(jù)庫(kù)操作有MySQL,MySQLi,PDO三種椎瘟,可以用適配器模式
統(tǒng)一成一致肺蔚,使不同的數(shù)據(jù)庫(kù)操作宣羊,統(tǒng)一成一樣的API腮猖。類(lèi)似的場(chǎng)景還有cache適配器澈缺,可以將
memcache,redis,file,apc等不同的緩存函數(shù),統(tǒng)一成一致项滑。 首先定義一個(gè)接口(有幾個(gè)方法枪狂,以及相應(yīng)的參數(shù))。然
后皇拣,有幾種不同的情況,就寫(xiě)幾個(gè)類(lèi)實(shí)現(xiàn)該接口颗胡。將完成相似功能的函數(shù)钉寝,統(tǒng)一成一致的方法。
5崩哩、策略模式
策略模式是對(duì)象的行為模式,用意是對(duì)一組算法的封裝。動(dòng)態(tài)的選擇需要的算法并使用窖维。
策略模式指的是程序中涉及決策控制的一種模式怯伊。策略模式功能非常強(qiáng)大崭篡,因?yàn)檫@個(gè)設(shè)計(jì)模式本身的核心思想就是面
向?qū)ο缶幊痰亩鄳B(tài)性思想寇甸。
策略模式的三個(gè)角色:
1.抽象策略角色
2.具體策略角色
3.環(huán)境角色(對(duì)抽象策略角色的引用)
實(shí)現(xiàn)步驟:
1.定義抽象角色類(lèi)(定義好各個(gè)實(shí)現(xiàn)的共同抽象方法)
2.定義具體策略類(lèi)(具體實(shí)現(xiàn)父類(lèi)的共同方法)
3.定義環(huán)境角色類(lèi)(私有化申明抽象角色變量咱扣,重載構(gòu)造方法,執(zhí)行抽象方法)
就在編程領(lǐng)域之外,有許多例子是關(guān)于策略模式的赔退。例如:
如果我需要在早晨從家里出發(fā)去上班窗骑,我可以有幾個(gè)策略考慮:我可以乘坐地鐵墙基,乘坐公交車(chē),走路或其它的途徑仰禽。
每個(gè)策略可以得到相同的結(jié)果温峭,但是使用了不同的資源。
6、注冊(cè)模式
注冊(cè)模式,解決全局共享和交換對(duì)象禁炒。已經(jīng)創(chuàng)建好的對(duì)象悠瞬,掛在到某個(gè)全局可以使用的數(shù)組上汰瘫,在需要使用的時(shí)候蝗拿,
直接從該數(shù)組上獲取即可。將對(duì)象注冊(cè)到全局的樹(shù)上。任何地方直接去訪問(wèn)。如何解決超賣(mài)問(wèn)題
參考答案:
1.悲觀鎖
2.樂(lè)觀鎖
3.隊(duì)列術(shù)
4.分布式鎖談?wù)剬?duì)MVC的認(rèn)識(shí)?
參考答案:
核心思想是:視圖和用戶交互通過(guò)事件導(dǎo)致控制器改變 控制器改變導(dǎo)致模型改變 或者控制器同時(shí)改變兩者 模型改變
導(dǎo)致視圖改變 或者視圖改變 潛在的從模型里面獲得參數(shù) 來(lái)改變自己。他的好處是可以將界面和業(yè)務(wù)邏輯分離。
Model(模型),是程序的主體部分,主要包含業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯。在模型層,還會(huì)涉及到用戶發(fā)布的服務(wù),在服
務(wù)中會(huì)根據(jù)不同的業(yè)務(wù)需求掘鄙,更新業(yè)務(wù)模型中的數(shù)據(jù)浊伙。
View(視圖),是程序呈現(xiàn)給用戶的部分,是用戶和程序交互的接口,用戶會(huì)根據(jù)具體的業(yè)務(wù)需求,在View視圖層輸
入自己特定的業(yè)務(wù)數(shù)據(jù)其爵,并通過(guò)界面的事件交互摩渺,將對(duì)應(yīng)的輸入?yún)?shù)提交給后臺(tái)控制器進(jìn)行處理绰姻。
Contorller(控制器),Contorller是用來(lái)處理用戶 輸入數(shù)據(jù)引瀑,已經(jīng)更新業(yè)務(wù)模型的部分。控制器中接收了用戶與界
面交互時(shí)傳遞過(guò)來(lái)的數(shù)據(jù)次慢,并根據(jù)數(shù)據(jù)業(yè)務(wù)邏輯來(lái)執(zhí)行服務(wù)的調(diào)用和更新業(yè)務(wù)模型的數(shù)據(jù)和狀態(tài)翔曲。說(shuō)下你對(duì)PHP中trait的理解
參考答案:
自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱(chēng)為 trait。 Trait 是為類(lèi)似 PHP 的單繼承語(yǔ)言而準(zhǔn)備的一種代碼復(fù)用機(jī)制均唉。Trait 為了減少單繼承語(yǔ)言的限制蚊逢,使開(kāi)發(fā)人員能夠
自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類(lèi)中復(fù)用 method镜会。Trait 和 Class 組合的語(yǔ)義定義了一種減少?gòu)?fù)雜性的方式,避免
傳統(tǒng)多繼承和 Mixin 類(lèi)相關(guān)典型問(wèn)題野瘦。
Trait 和 Class 相似史辙,但僅僅旨在用細(xì)粒度和一致的方式來(lái)組合功能佩伤。 無(wú)法通過(guò) trait 自身來(lái)實(shí)例化聊倔。它為傳統(tǒng)繼承
增加了水平特性的組合;也就是說(shuō)生巡,應(yīng)用的幾個(gè) Class 之間不需要繼承耙蔑。請(qǐng)你說(shuō)說(shuō)對(duì)OOP思想的理解
參考答案:
面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP孤荣,面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)甸陌。OOP 的一條
基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。 核心思想:封裝盐股,繼承钱豁,多態(tài). OOP
達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性疯汁。為了實(shí)現(xiàn)整體運(yùn)算牲尺,每個(gè)對(duì)象都能夠接收信息、處理數(shù)
據(jù)和向其它對(duì)象發(fā)送信息涛目。一個(gè)100G的大文件秸谢,里面存儲(chǔ)了電話號(hào)碼,文件格式如下:
15112345678 15112345679 15112345680 15112345681 15112345682
如何確認(rèn)電話號(hào)碼15112345680是否在文件中?
- 使用linux自帶的shell_exec方法去grep
- 使用fseek和fread進(jìn)行文件讀扰巍(超大文件讀取適合)
PHP實(shí)現(xiàn)協(xié)程的方式是什么估蹄?
參考答案:
yield如何解決PHP內(nèi)存溢出問(wèn)題?
參考答案:
1沫换、ini_set('memory_limit','500M');
2臭蚁、unset使用完畢的變量
3、分批處理讯赏,避免生成大數(shù)組PHP的垃圾回收機(jī)制(GC)中的zval變量容器是干啥用的垮兑?
參考答案:
引用計(jì)數(shù)器,如果按著了xdebug漱挎,可以打印出
<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
unset( $b, $c );
xdebug_debug_zval( 'a' ); ?>
以上例程會(huì)輸出:
a: (refcount=3, is_ref=0)='new string' a: (refcount=1, is_ref=0)='new string'
- PHP5與PHP7的區(qū)別
- 異常分為了Error和Exception
- PHP7比PHP5.0性能提升了兩倍
2.1系枪、變量存儲(chǔ)字節(jié)減小,減少內(nèi)存占用磕谅,提升變量操作速度
2.2私爷、改善數(shù)組結(jié)構(gòu)雾棺,數(shù)組元素和hash映射表被分配在同一塊內(nèi)存里,降低了內(nèi)存占用衬浑、提升了 cpu 緩存命中率
2.3捌浩、改進(jìn)了函數(shù)的調(diào)用機(jī)制,通過(guò)優(yōu)化參數(shù)傳遞的環(huán)節(jié)工秩,減少了一些指令尸饺,提高執(zhí)行效率 - 聲明返回類(lèi)型
- 新增加了結(jié)合比較運(yùn)算符
- 新增一些新的語(yǔ)法糖
PHP8
- 新增JIT(即時(shí)編譯) 性能提升
- 新增語(yǔ)法