大话转岗 PHP 开发小结
前言
近期因公司內(nèi)部轉(zhuǎn)崗,開(kāi)始參與PHP項(xiàng)目進(jìn)行后端開(kāi)發(fā),一直都是強(qiáng)類型寫的比較多,弱類型語(yǔ)言也有接觸了一些,如:nodejs,python,做一些輔助服務(wù),數(shù)據(jù)采集的事情,剛好內(nèi)部有這個(gè)機(jī)會(huì)進(jìn)行可以學(xué)以致用,加上之前對(duì)后端的理解和經(jīng)驗(yàn),很容易上手,這里記錄下開(kāi)發(fā)過(guò)程遇到的些問(wèn)題解決方案和自己對(duì)PHP的理解,以及項(xiàng)目中的部分架構(gòu)
當(dāng)前已經(jīng)進(jìn)入PHP7的版本,做了很多的調(diào)整,尤其在性能上有很大的提升
面向?qū)ο?/h3>
PHP框架內(nèi)置很多強(qiáng)大函數(shù),超級(jí)全局變量,魔術(shù)函數(shù),魔術(shù)變量,可以通過(guò)提供的內(nèi)置函數(shù)對(duì)PHP項(xiàng)目進(jìn)行拓展,數(shù)據(jù)類型操作,http信息獲取等,通過(guò)安裝拓展添加各種功能支持,框架內(nèi)置函數(shù)調(diào)用大部分還是偏向面向過(guò)程,通過(guò)調(diào)用函數(shù),傳入要操作的類型數(shù)據(jù)和依賴數(shù)據(jù),這里剛開(kāi)始有些不習(xí)慣,面向?qū)ο蟮拈_(kāi)發(fā)中習(xí)慣直接 類型變量/對(duì)象 點(diǎn)出函數(shù)。
現(xiàn)在PHP開(kāi)發(fā)可以選擇使用面向過(guò)程也可以用面向?qū)ο?#xff0c;最早PHP版本不支持面向?qū)ο筇匦?#xff0c;PHP5開(kāi)始對(duì)OOP有良好的支持,很多PHP開(kāi)發(fā)者沒(méi)有系統(tǒng)性的學(xué)習(xí)OOP相關(guān)知識(shí),包括工齡長(zhǎng)的PHP開(kāi)發(fā)者或者老的項(xiàng)目很多還是偏向面向過(guò)程開(kāi)發(fā),所以會(huì)接觸到很多偏向面向過(guò)程開(kāi)發(fā)的項(xiàng)目
在項(xiàng)目開(kāi)發(fā)過(guò)程中遇到些偏應(yīng)用業(yè)務(wù)開(kāi)發(fā)的項(xiàng)目,看似有用到類,但是并沒(méi)用到面向?qū)ο蟮奶匦詫?duì)業(yè)務(wù)進(jìn)行抽象,如:項(xiàng)目中每個(gè)業(yè)務(wù)功能有個(gè)php文件對(duì)應(yīng)一個(gè)類,類里里大部分都是邏輯function,然后通過(guò)拓展autoload,實(shí)現(xiàn)自動(dòng)include php文件,比如通過(guò)L函數(shù)傳入要調(diào)用的類名,構(gòu)造出PHP文件路徑,進(jìn)行include,然后返回類實(shí)例對(duì)象,只是通過(guò)類文件來(lái)區(qū)分功能函數(shù),并沒(méi)有使用到面向?qū)ο蟮奶匦赃M(jìn)行封裝,還是偏向面向過(guò)程思路在開(kāi)發(fā)
PHP5開(kāi)始對(duì)OOP提供了良好支持,基本已經(jīng)和java,C# 面向?qū)ο笳Z(yǔ)法相似,可以使用命名空間,封裝interface,abstract,多態(tài):implements,extends,PHP7還支持多繼承trait,方便封裝些公用的功能,通過(guò)PSR4規(guī)范,引入composer 實(shí)現(xiàn)的autoload,可以很好的進(jìn)行OOP開(kāi)發(fā)
PHP開(kāi)發(fā)還是比較靈活,可以面向過(guò)程也可以面向?qū)ο?#xff0c;根據(jù)具體的業(yè)務(wù)場(chǎng)景設(shè)計(jì)
使用composer psr4
- 在項(xiàng)目中添加composer.json文件,根據(jù)自己需求配置
- 在composer.json文件所在目錄下輸入命令,就會(huì)自動(dòng) download vendor/composer autoload 相關(guān)文件
- php中的入口index include autoload.php
- 注意,配置修改,內(nèi)容變更的時(shí)候需要執(zhí)行
弱類型問(wèn)題
編碼問(wèn)題:
在剛學(xué)習(xí)PHP語(yǔ)法的時(shí)候比較不習(xí)慣的就是弱類型,不用去定義變量類型,參數(shù)類型,返回值類型,對(duì)于習(xí)慣強(qiáng)類型的童鞋開(kāi)始會(huì)有些不習(xí)慣,不定義類型心里怪怪的,總感覺(jué)哪里會(huì)導(dǎo)致些錯(cuò)誤,而且弱類型在編碼的過(guò)程中IDE不會(huì)有類型錯(cuò)誤的一些提示,只有在運(yùn)行的時(shí)候報(bào)錯(cuò)了才能知道這里錯(cuò)誤了,錯(cuò)誤提示滯后。尤其是從DB查詢數(shù)據(jù)返回的是一個(gè)stdclass/array,獲取到的數(shù)據(jù)沒(méi)有對(duì)應(yīng)一個(gè)實(shí)體類,無(wú)法知道具體數(shù)據(jù)有哪些字段,需要通過(guò)查詢的sql語(yǔ)句,然后通過(guò)查看表結(jié)構(gòu)才能知道數(shù)據(jù)字段信息,這點(diǎn)很難受,影響開(kāi)發(fā)效率
PHP現(xiàn)在已經(jīng)支持typehint,通過(guò)定義類型可以對(duì)部分確定的類型變量,參數(shù),返回類型進(jìn)行強(qiáng)類型的定義,尤其需要定義表數(shù)據(jù)Model類,這樣得到數(shù)據(jù)對(duì)象后通過(guò)->可以感知出所有數(shù)據(jù)字段,方便后續(xù)拓展開(kāi)發(fā)和維護(hù)
根據(jù)場(chǎng)景使用,不能說(shuō)因?yàn)樽约毫?xí)慣使用強(qiáng)力型就把所有類型定義都寫成強(qiáng)類型
/*** Class MJop* @property int $id 工作ID* @property string $name 工作名字* @property int $salary 薪水*/ class MJop { }/*** Class MWorker* @property string $name 員工名字* @property int $age 年齡* @property MJop $jop 工作*/ class MWorker { }class Worker {/*** 獲取員工信息* @param int $id* @return MWorker|stdClass*/public function get(int $id): stdClass{// mysql selectreturn new stdClass();} }class Logic {/*** 獲取員工描述* @param int $workId* @return string*/public function Desc(int $workId): string{$worker = new Worker();$mWorker = $worker->get($workId);return '名字:' . $mWorker->name . ',年齡:' . $mWorker->age . ',工作:' + $mWorker->jop->name . ',薪水:' . $mWorker->jop->salary;} }復(fù)制代碼通過(guò)定義變量類型得到代碼感知
/** @var Logic $logic */ $logic=new Logic(); 復(fù)制代碼弱類型比較一個(gè)頭兩個(gè)大:
因?yàn)镻HP是弱類型原因,在做類型比較的時(shí)候,往往會(huì)因?yàn)橐粋€(gè)不小心就掉坑里,下面列出類型函數(shù)和類型比較的表格
就問(wèn)你,看到這些表格怕不怕,心中有一萬(wàn)只草泥馬奔騰而過(guò),瞬間變成幽怨的小眼神
使用 PHP 函數(shù)對(duì)變量 $x 進(jìn)行比較
| $x = ""; | string | TRUE | FALSE | TRUE | FALSE |
| $x = null; | NULL | TRUE | TRUE | FALSE | FALSE |
| var $x; | NULL | TRUE | TRUE | FALSE | FALSE |
| $x is undefined | NULL | TRUE | TRUE | FALSE | FALSE |
| $x = array(); | array | TRUE | FALSE | TRUE | FALSE |
| $x = false; | boolean | TRUE | FALSE | TRUE | FALSE |
| $x = true; | boolean | FALSE | FALSE | TRUE | TRUE |
| $x = 1; | integer | FALSE | FALSE | TRUE | TRUE |
| $x = 42; | integer | FALSE | FALSE | TRUE | TRUE |
| $x = 0; | integer | TRUE | FALSE | TRUE | FALSE |
| $x = -1; | integer | FALSE | FALSE | TRUE | TRUE |
| $x = "1"; | string | FALSE | FALSE | TRUE | TRUE |
| $x = "0"; | string | TRUE | FALSE | TRUE | FALSE |
| $x = "-1"; | string | FALSE | FALSE | TRUE | TRUE |
| $x = "php"; | string | FALSE | FALSE | TRUE | TRUE |
| $x = "true"; | string | FALSE | FALSE | TRUE | TRUE |
| $x = "false"; | string | FALSE | FALSE | TRUE | TRUE |
松散比較 ==
| TRUE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE |
| FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE |
| 1 | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| 0 | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE |
| -1 | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
| "1" | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| "0" | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
| "-1" | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
| NULL | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | TRUE |
| array() | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE |
| "php" | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
| "" | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE |
嚴(yán)格比較 ===
| TRUE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| 1 | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| 0 | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| -1 | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| "1" | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
| "0" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
| "-1" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
| NULL | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
| array() | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE |
| "php" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
| "" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE |
- 參考官方類型比較文檔
剛接觸PHP看到這幾個(gè)表格的時(shí)候會(huì)有點(diǎn)兒暈,開(kāi)發(fā)的時(shí)候需要特別注意下類型比較,對(duì)等比較盡量用'===',一些函數(shù)類型已經(jīng)能夠確定不會(huì)傳遞多類型參數(shù),就可以強(qiáng)制類型進(jìn)行限制,后面熟練度上來(lái)再看這個(gè)表格就感覺(jué)也還好,常用的類型之間的比較已經(jīng)深深的進(jìn)入到腦海中
其他問(wèn)題:
- IDE沒(méi)辦法給定義的變量進(jìn)行錯(cuò)誤提示,因?yàn)闆](méi)有定義類型IDE也不清楚定義變量的類型,沒(méi)辦法做錯(cuò)誤提醒,往往需要在運(yùn)行的時(shí)候輸出到頁(yè)面上才能發(fā)現(xiàn)問(wèn)題
- PHP弱類型引發(fā)的漏洞實(shí)例
PHP靈活性
上面說(shuō)了這么多弱類型下的問(wèn)題,這里說(shuō)下弱類型的優(yōu)點(diǎn),弱類型一個(gè)明顯的優(yōu)勢(shì)就是靈活
PHP動(dòng)態(tài)特性,可以動(dòng)態(tài)實(shí)例化,動(dòng)態(tài)添加屬性,動(dòng)態(tài)調(diào)用函數(shù),等,通過(guò)這些特性可以用簡(jiǎn)單的代碼封裝出強(qiáng)大的功能
簡(jiǎn)單舉栗子:
class Developer {public $name;public $hair;/*** 介紹*/public function introduce(){$desc = '名字:' . $this->name . ',發(fā)量:' . $this->hair;if (!empty($this->age)) $desc = $desc . ',年齡:' . $this->age;echo $desc . "\r\n";}/*** 數(shù)據(jù)邏輯處理* @param $condition* @return bool|string*/public function handle($condition){if (is_int($condition)) {// ... ... 邏輯return '數(shù)字處理結(jié)果';} else if (is_string($condition)) {// ... ... 邏輯return '字符串處理結(jié)果';} else if (is_array($condition)) {// ... ... 邏輯return '數(shù)組處理結(jié)果';} else {return false;}} }// -----動(dòng)態(tài)添加對(duì)象屬性----- $xm = new Developer(); $xm->name = '碼圣'; $xm->hair = 80;// 方式1 - 變量作為屬性名 // $fieldAge = 'age'; // $developer->$fieldAge = 20;// 方式2 - 直接設(shè)置屬性值 $xm->age = 20;// -----動(dòng)態(tài)調(diào)用對(duì)象函數(shù)-----// 變量作為函數(shù)名調(diào)用 $fn = 'introduce'; if (method_exists($xm, $fn)) $xm->$fn();// -----動(dòng)態(tài)實(shí)例化-----// 方式1 - 變量作為類名進(jìn)行實(shí)例化 $className = 'Developer';/** @var Developer $xf */ $xf = new $className(); $xf->name = '小方'; $xf->hair = 30; $xf->introduce();// ------屬性遍歷------ foreach ($xf as $key => $val) {echo $key . '=' . $val . "\r\n"; }// ------參數(shù)類型和返回值支持多類型------$rs = $xf->handle(null); if ($rs === false) {echo '處理失敗'; } else {echo $rs; }// ------函數(shù)變量------$fn = function () {echo 'do something'; };$fn();復(fù)制代碼獨(dú)特特性
內(nèi)存不常駐
PHP WEB服務(wù)端開(kāi)發(fā),服務(wù)器部署多依賴fastcgi進(jìn)程管理器,static變量和C#包括java生命周期不一樣,C#/java 的WEB應(yīng)用服務(wù)進(jìn)程靜態(tài)變量是常駐在內(nèi)存里并且共享,PHP大多使用nginx部署fastcgi進(jìn)程管理,服務(wù)器接收請(qǐng)求的進(jìn)程是彼此獨(dú)立的,請(qǐng)求響應(yīng)完了就回收資源,不存在常駐。
當(dāng)然PHP也是可以內(nèi)存常駐的,cli(命令行模式)下內(nèi)存是常駐,swoole框架開(kāi)發(fā)部署的WEB應(yīng)用服務(wù)也是內(nèi)存常駐
錯(cuò)誤級(jí)別
以往在C#開(kāi)發(fā)的時(shí)候,執(zhí)行遇到錯(cuò)誤會(huì)直接拋出異常,try catch 可以捕獲錯(cuò)誤異常,出現(xiàn)異常不會(huì)繼續(xù)執(zhí)行后面的內(nèi)容,PHP會(huì)比較不一樣,根據(jù)不同的錯(cuò)誤級(jí)別不一樣的執(zhí)行機(jī)制
PHP 有幾個(gè)錯(cuò)誤嚴(yán)重性等級(jí)。三個(gè)最常見(jiàn)的的信息類型是錯(cuò)誤(error)、通知(notice)和警告(warning)。它們有不同的嚴(yán)重性: E_ERROR、E_NOTICE和E_WARNING。錯(cuò)誤是運(yùn)行期間的嚴(yán)重問(wèn)題,通常是因?yàn)榇a出錯(cuò)而造成,必須要修正它,否則會(huì)使 PHP停止執(zhí)行。通知是建議性質(zhì)的信息,是因?yàn)槌绦虼a在執(zhí)行期有可能造成問(wèn)題,但程序不會(huì)停止。 警告是非致命錯(cuò)誤,程序執(zhí)行也不會(huì)因此而中止。
PHP 可以控制錯(cuò)誤是否在屏幕上顯示(開(kāi)發(fā)時(shí)比較有用)或隱藏記錄日志(適用于正式環(huán)境) 更改錯(cuò)誤報(bào)告行為:
# 方式1:配置php.ini error_reporting=E_ALL & ~E_NOTICE 復(fù)制代碼//方式2:函數(shù)調(diào)用設(shè)置報(bào)錯(cuò)級(jí)別 error_reporting(E_ALL & ~E_NOTICE); 復(fù)制代碼行內(nèi)錯(cuò)誤抑制: 錯(cuò)誤控制操作符 @ 來(lái)抑制特定的錯(cuò)誤。將這個(gè)操作符放置在表達(dá)式之前,其后的任何錯(cuò)誤都不會(huì)出現(xiàn)。
echo @$var['sflyq']; 復(fù)制代碼php的Error與Exception捕獲問(wèn)題:
Error是檢測(cè)到的這個(gè)問(wèn)題極有可能使程序無(wú)法繼續(xù)運(yùn)行,而Exception則是雖然有問(wèn)題但是程序繼續(xù)運(yùn)行不受影響。在php7以前的版本中Error類型是不能被捕獲的,僅僅可以捕獲Exception類型。php7以后Error與Exception都繼承了Throwable接口,使得Error被捕獲成為可能,在php7以下的版本也可以捕獲Error
- register_shutdown_function 注冊(cè)一個(gè) callback ,它會(huì)在腳本執(zhí)行完成或者 exit() 后被調(diào)用。
- set_error_handler 自己定義的方式來(lái)處理運(yùn)行中的錯(cuò)誤
- set_exception_handler 設(shè)置默認(rèn)的異常處理程序,用于沒(méi)有用 try/catch 塊來(lái)捕獲的異常
連接池
涉及數(shù)據(jù)庫(kù)開(kāi)發(fā)過(guò)程中一般都會(huì)用到連接池,通過(guò)使用連接池減少每次需要重新建立連接的時(shí)間消耗提高數(shù)據(jù)操作效率,在高并發(fā)業(yè)務(wù)場(chǎng)景下效果尤為明顯,因?yàn)槟壳按蟛糠諴HP應(yīng)用服務(wù)都是使用fastcgi的進(jìn)程管理,每個(gè)請(qǐng)求服務(wù)器會(huì)分配進(jìn)程去處理,返回結(jié)果后進(jìn)程資源就會(huì)自動(dòng)回收,因?yàn)檫@個(gè)因素?zé)o法建立連接池
方式1:
fastcgi模式下目前比較合理的方式就是通過(guò)單例模式,保證在當(dāng)前請(qǐng)求操作下的數(shù)據(jù)連接只創(chuàng)建一個(gè)對(duì)象
方式2:
可以通過(guò)swoole拓展實(shí)現(xiàn)數(shù)據(jù)連接池服務(wù),傳遞sql到服務(wù)里執(zhí)行返回?cái)?shù)據(jù),swoole內(nèi)存常駐,應(yīng)用客戶端連接斷開(kāi)連接池服務(wù)進(jìn)程資源不會(huì)自動(dòng)回收
多線程 協(xié)程
多線程
線程(thread) 是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)
- pthread擴(kuò)展
- 適用于cli
- 單獨(dú)配置php-cli.ini
- swoole
- 是一個(gè)底層網(wǎng)絡(luò)庫(kù)
- gearman
- 實(shí)現(xiàn)了一個(gè) Master-Worker 的模型
- 分布式任務(wù)分發(fā)
- 教程
- workerman
- php 實(shí)現(xiàn)的一個(gè)網(wǎng)絡(luò)庫(kù)
協(xié)程
線程是由操作系統(tǒng)內(nèi)核進(jìn)行調(diào)度的,我們無(wú)法干預(yù),協(xié)程是用戶態(tài)程序,相當(dāng)于應(yīng)用程序自己進(jìn)行了調(diào)度。
因?yàn)樗怯脩魬B(tài)程序,所以相當(dāng)于多個(gè)協(xié)程會(huì)運(yùn)行在一個(gè)線程中。
要注意的是,只有內(nèi)核對(duì)線程的調(diào)度才能夠利用cpu的多核資源,讓程序做到并行,所以在一個(gè)線程中的多個(gè)協(xié)程,是無(wú)法做到并行的。
用戶態(tài)和內(nèi)核態(tài):
簡(jiǎn)單一句話,程序執(zhí)行時(shí),如果執(zhí)行的是我們編寫的應(yīng)用程序的代碼,這些代碼就是運(yùn)行在用戶態(tài)的;當(dāng)代碼中調(diào)用了系統(tǒng)調(diào)用后,接下來(lái)內(nèi)核中的代碼就會(huì)執(zhí)行,內(nèi)核中的代碼就是運(yùn)行在內(nèi)核態(tài)的
- swoole 4.0 全新的協(xié)程內(nèi)核
應(yīng)用服務(wù)器架構(gòu)
服務(wù)部署:
- php7+nginx+php-fpm
- gitlab代碼托管,自動(dòng)發(fā)布環(huán)境
- ELK日志服務(wù)
- Elasticsearch 搜索引擎
- Logstash/Filebeat 用戶日志處理
- Kibana 用于對(duì)存儲(chǔ)在Elasticsearch里的結(jié)構(gòu)化數(shù)據(jù)做可視化展現(xiàn)
- mysql
- 根據(jù)業(yè)務(wù)分布式集群
- redis
- codis 分布式部署
- mongodb
- kafaka
- 日志記錄,BI處理
代碼托管和測(cè)試環(huán)境:
均使用阿里云服務(wù)器,代碼托管自建gitlab服務(wù),從開(kāi)發(fā)分支合并到gitlab環(huán)境分支自動(dòng)部署到對(duì)應(yīng)環(huán)境服務(wù)器上
- 測(cè)試環(huán)境
- test-app.sflyq.com
- 測(cè)試數(shù)據(jù)庫(kù)
- 公司內(nèi)網(wǎng)訪問(wèn)
- gitlab release
- 預(yù)發(fā)環(huán)境
- yf-app.sflyq.com
- 生產(chǎn)數(shù)據(jù)庫(kù)
- 公司內(nèi)網(wǎng)訪問(wèn)
- gitlab simulation
- 生產(chǎn)環(huán)境
- app.sflyq.com
- gitlab master
- 本地測(cè)試環(huán)境
- 通過(guò)docker部署
最近階段感悟
從一個(gè)熟悉的語(yǔ)言到另一個(gè)相對(duì)陌生的語(yǔ)言,語(yǔ)言只是工具,在適合的場(chǎng)景下使用適合的工具,從自己熟悉的業(yè)務(wù)到陌生的業(yè)務(wù),離開(kāi)自己的舒服區(qū),擁抱變化才能成長(zhǎng)
在相同的后端領(lǐng)域切換語(yǔ)言學(xué)習(xí)成本還是比較低的,主要是對(duì)后端開(kāi)發(fā)的思路,經(jīng)驗(yàn)是可以共用的,只是換了個(gè)語(yǔ)言去實(shí)現(xiàn)
當(dāng)公司發(fā)展到一定的規(guī)模,崗位職能區(qū)分的很細(xì),做應(yīng)用開(kāi)發(fā)的童鞋接觸不到服務(wù)器架構(gòu),沒(méi)有機(jī)會(huì)接觸職能以外的技術(shù),工作內(nèi)容除了完成業(yè)務(wù)需求開(kāi)發(fā),還是業(yè)務(wù)需求開(kāi)發(fā),這樣常年開(kāi)發(fā)下去對(duì)個(gè)人成長(zhǎng)的局限性很高,需要自己在工作之余進(jìn)行拓展,對(duì)公司內(nèi)部有興趣的技術(shù)進(jìn)行了解和學(xué)習(xí),耐心等待機(jī)會(huì)的到來(lái)
在結(jié)尾重點(diǎn)說(shuō)下作為開(kāi)發(fā)應(yīng)該有的工作態(tài)度,感覺(jué)大部分開(kāi)發(fā)參與項(xiàng)目普遍責(zé)任感和帶入感不強(qiáng),需求過(guò)來(lái)沒(méi)有多想,啪啪啪就是一梭子代碼,按照產(chǎn)品的邏輯流程碼了整個(gè)業(yè)務(wù)功能,功能測(cè)試上線可以正常運(yùn)行沒(méi)有問(wèn)題,然后功成身退,兩耳不聞天下事,作為開(kāi)發(fā)在參與項(xiàng)目把自己擺在什么樣的位置決定這你是什么樣的工作態(tài)度
從項(xiàng)目角度出發(fā)應(yīng)該把自己所有參與的項(xiàng)目當(dāng)成自己的孩子,需要主動(dòng)關(guān)注和關(guān)心項(xiàng)目的數(shù)據(jù)情況和后續(xù)發(fā)展,伴隨著孩子成長(zhǎng)了,慢慢就有了成就感
從技術(shù)角度出發(fā)需要把項(xiàng)目需求功能開(kāi)發(fā)當(dāng)成造房子,需要分析業(yè)務(wù)需求提供合理的設(shè)計(jì)方案,適當(dāng)?shù)某橄蠛褪褂迷O(shè)計(jì)模式,只有在開(kāi)發(fā)的時(shí)候把地基打穩(wěn)了才能保證后續(xù)的維護(hù)和拓展,避免技術(shù)債
2019年開(kāi)年第一篇,祝大家和自己新的一年里豬事順利,大吉大利!
歡迎Star 【大話WEB開(kāi)發(fā)】
轉(zhuǎn)載于:https://juejin.im/post/5c6ab93bf265da2da00ea3e4
總結(jié)
以上是生活随笔為你收集整理的大话转岗 PHP 开发小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Pytorch系列-26]:神经网络基
- 下一篇: PHP京东商城爬取网页乱码问题解决