『壹』 零基礎學習php
LAMP兄弟連有很詳細免費的PHP視頻教程
『貳』 PHP 多態應用問題!
$this是訪問當前類中的成員,在mypc類中,並沒有type()和alert()這兩個方法. 另外pcusb($t)方法中,$t參數接收的是一個對象,所以在 pcusb($t)方法內要用$t->type();...
『叄』 php 多態 有什麼用
多態性,其來自於dictionary.com的定義是"以不同形式,階段或者類型出現在獨立的組織中或者同種組織中,而不存在根本區別。"由該定義, 我們可以認為,多態性是一種通過多種狀態或階段來描述相同對象的編程方式。其實,它的真正意義在於:實際開發中,我們只需要關注一個介面或基類的編程,而 不必擔心一個對象所屬於的具體類(class)。
如果你熟悉設計模式,即使只是有個初步了解,那麼你也會了解這個概念。事實上,多態 性可能是基於模式設計編程中的最偉大的工具。它允許我們以一種邏輯的方式來組織相類似的對象從而實現在具體編碼時不必擔心對象的具體類型;而且,我們只需 要對一個所期望的介面或基類編程即可。一個應用程序越抽象,則它就顯得越靈活--而多態性是對行為加以抽象的最好的方式之一。
例如, 讓我們考慮一個叫Person的類。我們可以用稱為David,Charles和Alejandro的類來子類化Person。Person有一個抽象方 法AcceptFeedback(),所有的子類都要實現這個方法。這意味著,任何使用基類Person的子類的代碼都能調用方法 AcceptFeedback()。你不必檢查該對象是一個David還是一個Alejandro,僅知道它是一個Person就夠了。結果是,你的代碼 只需關注"最小公分母"-Person類即可。
在這個示例中的Person類也可以被創建為一個介面。當然,與上面相比存在一些區 別,主要在於:一個介面並沒有給出任何行為,而僅確定了一組規則。一個Person介面要求的是"你必須支持AddFeedback()方法",而一個 Person類可以提供一些AddFeedback()方法的預設代碼-你對之的理解可以是"如果你不選擇支持AddFeedback(),那麼你應該提 供一種預設實現。"至於如何選擇介面或基類則並非本文的主題;但是,一般說來,你需要通過基類來實現一個預設的方法。如果你能夠簡單地勾勒出你的類所要實 現的一組期望的功能,那麼你也可以使用一個介面。
『肆』 php是什麼意思
php通常指超文本預處理器,用於面向對象、命令式編程,是一種通用開源腳本語言。
主要特點:
為開源性和免費性、快捷性、資料庫連接的廣泛性、面向過程和面向對象並用。優點是利於學習,使用廣泛。此外,php還可以指菲律賓比索的標准貨幣代碼符號,MPLS網路中的倒數第二跳彈出功能。是英文超級文本預處理語言Hypertext Preprocessor的縮寫。PHP 是一種HTML 內嵌式的語言,是一種在伺服器端執行嵌入HTML文檔的腳本語言,語言風格有些類似於C語言,被廣泛的運用。
簡介:
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
特性包括:
1、PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法
2、PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;PHP具有非常強大的功能,所有的CGI的功能PHP都能實現
3、 PHP支持幾乎所有流行的資料庫以及操作系統。
4、最重要的是PHP可以用C、C++進行程序的擴展!
語言特點:
開源免費
PHP是一個受眾大並且擁有眾多開發者的開源軟體項目,linux + Nginx + Mysql + PHP是它的經典安裝部署方式,相關的軟體全部都是開源免費的,所以使用PHP可以節約大量的正版授權費用。不過PHP作為一個開源軟體,它缺乏大型科技公司的支持背景,網路上對它的唱衰也是經久不衰,不過它的持續迭代和性能持續增強的現實卻是鼓舞人心的,PHP社區用實際行動給予各種質疑強有力的回擊。
快捷高效
PHP的內核是C語言編寫的基礎好效率高,可以用C語言開發高性能的擴展組件;PHP的核心包含了數量超過1000的內置函數,功能應有盡有很全面,開箱即用程序代碼簡潔; PHP數組支持動態擴容,支持以數字、字元串或者混合鍵名的關聯數組,能大幅提高開發效率; PHP是一門弱類型語言,程序編譯通過率高,相對其他強類型語言開發效率快;PHP天然熱部署,在php-fpm運行模式下代碼文件覆蓋即完成熱部署;PHP經過20多年的發展,在互聯網上可以搜到海量的參考資料供參考學習。
性能提升
PHP版本越高它的整體性能越高,根據官方介紹,PHP7.0.0 對比PHP5.6性能就提升了2倍,PHP7.4已經比PHP7.0快了約30%,PHP8.0在性能上又相對PHP7.4大約改進了10%。PHP 8.0 引入了 JIT編譯器特性,同時加入多種新的語言功能,例如命名參數、聯合類型、註解、Constructor Property Promotion、match 表達式、nullsafe 運算符以及對類型系統、錯誤處理和一致性的改進。PHP擁有自己的核心開發團隊,保持5年發布一個大版本、1個月發布2個小版本的頻率,最新的版本是PHP8.08 。
跨平台
每個平台都有對應的php解釋器版本,指針對不同平台均編譯出目標平台的二進制碼(PHP解釋器),php開發的程序可以不經修改運行在windows、linux、unix等多個操作系統上。
常駐內存
php-cli模式下可以實現程序常駐內存,各種變數和資料庫連接都能長久保存在內存實現資源復用,比較常用的做法是結合swoole 組件編寫cli框架。
頁面生命周期
在php-fpm模式下,所有的變數都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空,對程序員水平要求低,佔用內存非常少,特別適合中小型系統的開發。
運行機制:
PHP常見的運行模式有2種,分別是php-fpm 和php-cli 。當PHP 選擇運行在php-fpm模式下,所有的變數都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空。運行在php-cli模式下可以實現程序常駐內存,各種變數和資料庫連接都能長久保存在內存 實現資源復用,性能可以得到很大的提升,php-cli開發比較復雜能但是能夠獲取更高的性能,對開發者的要求比較高需要比較高的開發水平,比較常用的模式是結合swoole 組件編寫cli框架,各種變數能保存在跨進程的高性能共享內存 Table ,可以開發出支持熱啟動的php-cli可靠各類應用系統。
php-fpm在PHP 5.3.3 版本成為了官方正式組件(2010-07-22),它提供了穩定可靠的進程管理服務,進程不足時候可以智能擴充數量,閑置時候可以自動回收銷毀多餘的進程,同時它對程序的容錯能力很強大運行非常穩定,可以應付企業級的開發需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互聯網協議下進行的用戶的輸入輸出,頁面級生命周期各種資源用完即釋放,不存在內存泄漏的問題。php-fpm也提供有一些常駐內存的技術支持,例如PHP 7.4引入的opcache.preload也能實現局部的PHP類和函數的常駐內存,不過這個方法不夠靈活,和伺服器配置捆綁的太死了。
php-cli因為能實現各類資源的常駐內存,所以可以資源復用,更高效完成多進程編程和非同步編程,可以開發出負載能力更高的應用系統。但是相對php-fpm的簡單編程開發,開發者要注意很多的事項和需要做很多附加的控制器開發,否則就無法實現期待中的高性能。
首先開發者需要去實現可靠的進程管理服務,保證系統進程遇到各類錯誤退出運行後能夠自動創建新的進程,只有這樣才能保證後續的服務請求有足夠空閑進程可分配。每個業務代碼段都要做異常處理,讓進程遇到非致命錯誤時候不會退出,因為進程重啟意味程序和各類資源需要再次載入,這個過程性能消耗不小,所以只有進程穩定運行了常駐內存才有意義。
其次因為常駐內存,編寫的新的程序必須重啟服務才能生效,這一點習慣了fpm模式的開發者會感到比較陌生。另外開發者需要手工釋放內存,否則系統長時間運行後會出現內存泄露。同時在cli模式下,我們不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 進行編程工作,需要自己去解析各種互聯網通訊協議完成用戶的輸入輸出。要實現多進程編程利用多核CPU計算,還有學習使用pcntl和posix編程,這里涉及到了非同步編程邏輯,這塊難度還是比較大的。比較常用的模式是結合swoole 組件編寫cli框架。
PHP是一個活躍的社區開發語言,有專業的核心開發團隊在持續不斷的迭代,最近一個版本就是PHP 8.0.8 引入了很多的新特性。
語言參考:
內置函數
PHP 有很多標準的函數和結構。還有一些函數需要和特定的擴展模塊一起編譯,否則在使用它們的時候就會得到一個致命的「未定義函數」錯誤。例如,要使用 image 函數中的 imagecreatetrue,需要在編譯 PHP 的時候加上 GD 的支持。或者要使用 mysqli_connect函數,就需要在編譯 PHP 的時候加上 MySQLi 支持。有很多核心函數已包含在每個版本的 PHP 中如字元串和變數函數。調用 phpinfo或者 get_loaded_extensions可以得知 PHP 載入了那些擴展庫。同時還應該注意,很多擴展庫默認就是有效的。
靜態網站與動態網站的區別
靜態網站:web1.0 時代
動態網站:web2.0 時代
靜態網站特點:
1、網頁內容一經發布到網站伺服器,無論是否有用戶訪問,每個靜態頁面的內容都是保存在網站伺服器上的。也就是說,靜態網頁是實實在在保存在伺服器上的文件,每個網頁都是一個獨立的文件。
2、靜態網頁的內容相對穩定,因此容易被搜索引擎檢索。
3、 靜態網頁沒有資料庫的支持,在網站製作和維護方面工作量較大,因此當網站信息量很大時完全依靠靜態網頁製作方式比較困難。
4、靜態網頁的交互性較差,在功能方面有較大的限制。
『伍』 php中什麼是多態
多態就是同一個行為,作用不同的對象返回的結果不一樣,這個用處挺大的
『陸』 PHP真的能算是面向對象的語言嗎
面向對象三大特性:封裝,繼承,多態
php可以封裝對象,也可以繼承,同樣可以實現多態
多態是指指出重寫和重載,php子類可以重寫父類的方法,也可以通過方法的參數數量不同來重載方法,我覺得是面向對象語言
『柒』 要怎麼理解PHP中的多態
面向對象是什麼?你可以說出這個答案嗎(相信沒有正確答案)?我覺得面向對象只是軟體工程中的一種工具而已。那軟體工程的目的是什麼?目的是編寫出可靠、高效、靈活、易擴展、可復用的軟體產品。既然面向對象是軟體工程當中的一種工具,那我們使用面向對象的目的也應該是這些。就是說我們用面向對象的目的是編寫出可靠、高效、靈活、易擴展、可復用的軟體產品。我們一定要以這個目的為中心來學習和使用面向對象,不然你會失去方向。大多時候講面向對象,多是講面向對象本身,而不講怎麼利用面向對象去解決實際的問題,這樣很容易誤導初學者。再加上華麗的文字,很多人覺得只要面向對象了,什麼事都可以OK了。舉個例子,給你一把最好的槍,教你如何使用它,過了一段時間你對這把槍了如指掌。現在讓你去打靶,結果100發子彈,一發都沒有打中。咦,我不是用了最好的槍了嗎?為什麼一發都打不中?因為你不知道射擊要領,不知道如何瞄準靶心,結果當然可想而知了。我們要OOP(Object-Oriented Programming),不要POO(Programming Object-Oriented)。
面向對象有3大特徵(一般講面向對象都會提到這三個),繼承、封裝、多態。按字面上理解,對我們來說是全新的概念,但只要你分析一下,就會發現這些都是我們在編程中,常常用到的概念。
封裝是什麼?只有在面向對象里才有封裝的概念嗎?不是的,只要是程序就有封裝。大家常常用的變數、函數就是封裝。舉個例子,你寫了取用戶狀態的函數,對調用這個函數的程序來說,取用戶狀態邏輯是封閉的,所以邏輯發生變化時,不會對調用的程序造成影響。變數也是封裝,你定義了一個int變數,無論你給它賦什麼值,對調用這個變數的程序來說,就是一個整數型類型的值。提到封裝不得不提介面,因為封裝是做介面的過程。介面是什麼?只有用了interface這個關鍵字才是介面嗎?詞典里的解釋是物體的接觸面、界面。世界是由物體組成的,所以我們的生活當中到處是介面。你看到一個球,它是圓的,圓就是介面。我們的程序也都是由介面組成的,數據類型、關鍵字、函數、變數等等。比如說看到int這個詞,你就知道它是整數型數據類型,我們可以說:int是整數型數據類型的介面。所以封裝和介面不是面向對象特有的概念,只不過在面向對象里它們的范圍擴大了而已。我們在網上常常能看到面向對象和面向過程之間的討論,說哪一個好。其實,這些都是不重要的,因為用哪一個方法,都是做介面的過程。關鍵在於使用這些方法的程序員,看你的抽象能力怎麼樣了。
多態可能是我們最難理解的一個概念,polymorphism這個詞,因為大家沒有學習過面向對象的話,是很難碰到的。其實這個也是我們常常用到的一個概念,只不過沒有給它命名而已(至少沒用多態來命名它)。看下面的例子, double a = 0,b=5,c=0;
a = 1;
c = a + b;
cout << c << endl;
a = 3.5f;
c = a + b;
cout << c endl;
輸出結果是
6
8.5
我們先定義了三個變數,a、b、c,先後給A賦值1,3.5,然後輸出a+b的結果,可以看到,同樣的邏輯隨著a值的變化,輸出的結果也是不一樣的(多態的效果)。在這里double是高類型(相當於父類),1、3.5(int,float)是低類型(相當於子類)。這個例子是變數的多態,那有沒有函數多態的例子,當然有,寫過C的人都知道函數指針,它就是函數的多態。
終於要說說對象了,重點就在這里~ 第一,類是一個模塊。以前我們的模塊是一個文件,比如一個.c、.cpp等等。一個模塊文件里寫什麼功能函數沒有限制(理論上沒有明確定義該怎麼寫),按開發人員的經驗來部署這些功能函數。所以很容易寫出超級模塊(一個文件里有幾十個、幾百個函數),代碼維護起來很不方便。面向對象就很好的解決了這個問題,只要看過面向對象基礎理論的程序員都知道,先定義類,然後把相關的函數放到類里。面向對象里有一個原則,類單一職責原則,遵循這個原則的話,你可以寫出很好的模塊出來。更重要的是我們溝通維護起來也很方便,比如以前溝通可能是這樣的,修改customer.cpp文件里的某一個函數,面向對象里呢,可以這樣說修改客戶類的某一個方法。這個非常重要,因為這個跟人的思維有密切關系。比如我們到餐廳去吃飯,你對服務員說我要一瓶啤酒,我確信服務員會再問你一句:先生,你要什麼牌子的啤酒?但如果你說:我要一瓶百威啤酒,服務員肯定不會再問你。要是把一個系統看成生產線的話,類就是工人。一個工人只負責一個操作,A負責打孔,B負責裝螺絲釘,C負責包裝。這樣做非常有效率,而且出了問題,很好確定問題出現在哪個工人。第二,類是一個自定義數據類型。理解了這點,你的思路會清晰起來,也不會對面向對象感到陌生。看下面的簡單例子,
//計算兩個數的合
double sum(double a,double b);
int _tmain(int argc, _TCHAR* argv[])
{
double a=0,b=0;
a = 1;
b = 2;
cout << sum(a,b) << endl;
a = 1.2f;
b = 2.3f;
cout << sum(a,b) << endl;
return 0;
}
//計算兩個數的合
double sum(double a,double b)
{
return a+b;
}
例子里,低類型的int和float賦值給了高類型的double,然後用sum函數它們的合。如果編程語言不支持這種轉換的話,我們只好寫兩個函數了,
//處理int的計算
int sum(int a,int b);
//處理float的計算
float sum(float a,float b);
所以我們可以確定-同類型當中,只有提供從低到高類型的轉換,才可以實現多態的效果(不知道,沒有面向對象以前是什麼概念)。當然,類作為數據類型,也需要這種轉換了。但類是自定義類型,所以,哪個是高類型,哪個是低類型,必須要由我們來定義:父類是高類型、子類是低類型(繼承是這么誕生的嗎:))。繼承讓我們可以復用父類的代碼,但在這個例子中我們可以看出,它的主要目的是在多態。
上面我們討論了面向對象和它的三個特徵,我們可以看到,這些都是編程當中常常用到的概念。我覺得最大的突破是給我們提供了新的思維模式、新的代碼組織結構、定義了以前軟體設計中比較模糊的概念(比如多態)。那我們怎麼轉換我們的思維呢?把你想像成公司的經理就可以了。你現在是一家公司的經理了,部門就是子系統,員工就是對象。你需要做的就是這些,
-每天會有很多事需要你處理,做好心裡准備。
-公司做什麼業務?
-要建立幾個部門?,規定部門之間的溝通規則。
-需要什麼樣的職位?每個職位要做的事是什麼?
-規定業務流程,業務流程中,需要哪個部門參與?需要哪個員工參與?他們之間怎麼溝通?
-借鑒成功的管理模式,但要符合公司的情況,不要盲目地使用,因為代價太大了。
-不要設置太多的溝通環節,能簡單就簡單,只要完成目標就可以。
-准備應對變化。世界上沒有對於錯,永遠是前進中不斷修正。
就這些啦?恩,道理很簡單,但要做一個好公司就非常困難了,因為變數太大了。面向對象也是一樣的,需要付出努力,才可以做好。
『捌』 PHP中多態如何實現
用trait,定義類,在被繼承的類中,use,定義的trait類。
ps:use,可以多個,就是php中簡單的多態的實現
『玖』 誰有面試phper的經驗
這方面網上有比較多的,針對3-5年的PHPer常見的面試題,參考如下:
1、平時喜歡哪些php書籍及博客?CSDN、虎嗅、獵雲
2、js閉包是什麼?
3、for與foreach哪個更快?
4、php鳥哥是誰?能不能講一下php執行原理?
5、php加速器有哪些?apc、zend、xcache.....能不能講一下它的加速原理?
6、Node.js能徹底代替php+apache是扯淡。
7、怎樣判斷一個值是否存在於數組中?in_array(),array_key_exists,......
8、怎樣判斷select語句中是否使用了索引?explain
9、sphinx的中文分詞詞庫使用第三方庫還是自己建庫?
10、如果一個被面試者經驗少、基礎差,此時卻問些高深的知識。要懷疑它的穩定性,可以提問加班對他會不會有抵觸。
11、mysql與mysqli的區別有哪些?
12、將來的發展方向?安全、還是數據挖掘、大數據處理?
13、php的面向對象:類的修飾符、封裝、繼承、多態體現方面
14、php 多態是什麼?
15、Type Hinting:http://www.php.net/manual/en/language.oop5.typehinting.php
16、php的設計模式:單例模式、工廠模式、生產者模式......等23種
17、伺服器狀態碼:200、202、301、404、500......
18、i++與++i的區別?
19、項目開發:電商項目中的購物車數據持久化、考試系統的安全性考慮、
20、mysql設計基礎:三大範式、功能->思維導圖、創建表的第一欄位是什麼?
21、mysql欄位char、varchar、int、smallint、tinyint、mediumint、bigint、decimal、double、float位元組數及應用場景。
22、memcache與mongoDB、Redis各自的使用場景是什麼?
23、為什麼mongoDB與Redis非但沒有形成競爭反而是互補關系?
24、Redis數據類型有哪些?int、string、hash、set、list ?
25、安裝linux軟體時使用make方式還使用yum方式?
26、linux網路優化:查看進程ps -aux|grep mysqld、怎樣查看最大文件打開數?
27、C語言中的虛函數是什麼?
28、1條微薄要推送給100萬個粉絲該怎麼處理?
29、知道哪些演算法?冒泡排序?快速排序?二分查找法?
30、yii thinkphp ci 各自優點
31、php 設計模式有哪些?
32、c 排序演算法有哪些?
33、php 基本結構是什麼?
34、memcache magent 分布式設計?
35、redis 分布式設計,如何設計?
36、mongo 集群架構是怎樣的?
37、mysql 索引原理及sql性能優化
38、tcp/ip 網路協議,osi7層指是什麼?
39、php 處理大數據業務
40、linux 應用 負載性能查看 ?
41、nginx 實戰優化業務功能 ?
42、談一下近三年來你的得意之作?
43、看看簡歷,會問一些過去做的項目的用戶量、pv、吞吐量、相關難點和解決方法等
44、資料庫設計經驗,為什麼進行分表? 分庫?
45、一般多少數據量開始分表? 分庫? 分庫分表的目的? 什麼是資料庫垂直拆分? 水平拆分? 分區等等?可以舉例說明
46、資料庫優化有哪些? 分別需要注意什麼?
47、web開發方面會遇到哪些緩存? 分別如何優化?
48、給你256M的內存,對10G的文件進行排序(文件每行1個數字),如何實現?
49、對10G的文件進行查找如何實現?
50、統計10G文件每個關鍵字出現的次數如何實現?
51、假如你現在是12306火車訂票的設計師,你該如何設計滿足全國人民訂票?
52、假如有1億用戶的訪問量,你的伺服器架構是怎樣的? 用戶信息的存儲方案如何設計?
53、如果你是技術組長,所帶團隊任務進度無法完成你該如何解決?
54、如果在進度排滿的前提下插入任務,你該如何保證總進度不延期?
55、如果有的工程師今天預定任務沒有完成,你該如何解決?
56、從你的經驗方面談一下如何構建高性能web站點? 需要哪些環節? 步驟? 每個步驟需要注意什麼如何優化等?
57、為什麼要對資料庫進行主從分離?
58、如何處理多伺服器共享session?
59、一個10G的表,你用php程序統計某個欄位出現的次數,思路是?
60、會告訴你一個nginx日誌例子,用你認為最佳的編程語言統計一下http響應時間超過1秒的前10個url?
61、給你一個mysql配置文件,用你認為最佳的編程語言解析該文件?
62、給你兩個路徑a和b,寫一個演算法或思路計算a和b差距幾層並顯示a和b的交集?
63、給你一個url,在nginx配置一下rewrite指定到某個具體路徑?
64、一個php文件的解釋過程是? 一般加速php有哪些? 提高php整體性能會用到哪些技術?
65、session和cookie生存周期區別? 存儲位置區別?
66、require、include、require_once、include_once區別? 載入區別? 如果程序按需載入某個php文件你如何實現?
67、chrome號稱為多線程的,所以多線程和多進程的區別為?
68、php在2011年底出現hash碰撞,hash碰撞原理為? 如何進行修復?
69、web不安全因素有哪些? 分別如何防範?
70、假如兩個單鏈表相交,寫一個最優演算法計算交點位置,說思路也可以?
71、假如你是技術組長? 如何提高團隊效率?
72、nginx負載均衡有哪些? 如果其中一台伺服器掛掉,報警機制如何實現?
73、不優化前提下,apache一般最大連接數為? nginx一般最大連接數為? mysql 每秒insert ? select ? update ? delete?
74、mysql 數據類型有哪些 ? 分別佔用多少存儲空間 ?
75、nginx設置緩存js、css、圖片等信息,緩存的實現原理是?
76、如何提高緩存命中率? 如何對緩存進行顆粒化?
77、php的內存回收機制是?
78、我的所有問題都問完了(當然沒有這么多),你有什麼問題問我沒有?