摘要:錯(cuò)誤是運(yùn)行期間的嚴(yán)重問題,通常是因?yàn)榇a出錯(cuò)而造成,必須要修正它,否則會(huì)使停止執(zhí)行。警告是非致命錯(cuò)誤,程序執(zhí)行也不會(huì)因此而中止。
前言
近期因公司內(nèi)部轉(zhuǎn)崗,開始參與PHP項(xiàng)目進(jìn)行后端開發(fā),一直都是強(qiáng)類型寫的比較多,弱類型語言也有接觸了一些,如:nodejs,python,做一些輔助服務(wù),數(shù)據(jù)采集的事情,剛好內(nèi)部有這個(gè)機(jī)會(huì)進(jìn)行可以學(xué)以致用,加上之前對(duì)后端的理解和經(jīng)驗(yàn),很容易上手,這里記錄下開發(fā)過程遇到的些問題解決方案和自己對(duì)PHP的理解,以及項(xiàng)目中的部分架構(gòu)
當(dāng)前已經(jīng)進(jìn)入PHP7的版本,做了很多的調(diào)整,尤其在性能上有很大的提升面向?qū)ο?/b>
PHP框架內(nèi)置很多強(qiáng)大函數(shù),超級(jí)全局變量,魔術(shù)函數(shù),魔術(shù)變量,可以通過提供的內(nèi)置函數(shù)對(duì)PHP項(xiàng)目進(jìn)行拓展,數(shù)據(jù)類型操作,http信息獲取等,通過安裝拓展添加各種功能支持,框架內(nèi)置函數(shù)調(diào)用大部分還是偏向面向過程,通過調(diào)用函數(shù),傳入要操作的類型數(shù)據(jù)和依賴數(shù)據(jù),這里剛開始有些不習(xí)慣,面向?qū)ο蟮拈_發(fā)中習(xí)慣直接 類型變量/對(duì)象 點(diǎn)出函數(shù)。
現(xiàn)在PHP開發(fā)可以選擇使用面向過程也可以用面向?qū)ο?,最早PHP版本不支持面向?qū)ο筇匦?,PHP5開始對(duì)OOP有良好的支持,很多PHP開發(fā)者沒有系統(tǒng)性的學(xué)習(xí)OOP相關(guān)知識(shí),包括工齡長(zhǎng)的PHP開發(fā)者或者老的項(xiàng)目很多還是偏向面向過程開發(fā),所以會(huì)接觸到很多偏向面向過程開發(fā)的項(xiàng)目
在項(xiàng)目開發(fā)過程中遇到些偏應(yīng)用業(yè)務(wù)開發(fā)的項(xiàng)目,看似有用到類,但是并沒用到面向?qū)ο蟮奶匦詫?duì)業(yè)務(wù)進(jìn)行抽象,如:項(xiàng)目中每個(gè)業(yè)務(wù)功能有個(gè)php文件對(duì)應(yīng)一個(gè)類,類里里大部分都是邏輯function,然后通過拓展autoload,實(shí)現(xiàn)自動(dòng)include php文件,比如通過L函數(shù)傳入要調(diào)用的類名,構(gòu)造出PHP文件路徑,進(jìn)行include,然后返回類實(shí)例對(duì)象,只是通過類文件來區(qū)分功能函數(shù),并沒有使用到面向?qū)ο蟮奶匦赃M(jìn)行封裝,還是偏向面向過程思路在開發(fā)
PHP5開始對(duì)OOP提供了良好支持,基本已經(jīng)和java,C# 面向?qū)ο笳Z法相似,可以使用命名空間,封裝interface,abstract,多態(tài):implements,extends,PHP7還支持多繼承trait,方便封裝些公用的功能,通過PSR4規(guī)范,引入composer 實(shí)現(xiàn)的autoload,可以很好的進(jìn)行OOP開發(fā)
PHP開發(fā)還是比較靈活,可以面向過程也可以面向?qū)ο?,根?jù)具體的業(yè)務(wù)場(chǎng)景設(shè)計(jì)
使用composer psr4
在項(xiàng)目中添加composer.json文件,根據(jù)自己需求配置
{ "autoload": { "psr-4": { "Library": "library/" } } }
在composer.json文件所在目錄下輸入命令,就會(huì)自動(dòng) download vendor/composer autoload 相關(guān)文件
composer install
php中的入口index include autoload.php
include_once "vendor/autoload.php";
注意,配置修改,內(nèi)容變更的時(shí)候需要執(zhí)行
composer dump-autoload -o
在剛學(xué)習(xí)PHP語法的時(shí)候比較不習(xí)慣的就是弱類型,不用去定義變量類型,參數(shù)類型,返回值類型,對(duì)于習(xí)慣強(qiáng)類型的童鞋開始會(huì)有些不習(xí)慣,不定義類型心里怪怪的,總感覺哪里會(huì)導(dǎo)致些錯(cuò)誤,而且弱類型在編碼的過程中IDE不會(huì)有類型錯(cuò)誤的一些提示,只有在運(yùn)行的時(shí)候報(bào)錯(cuò)了才能知道這里錯(cuò)誤了,錯(cuò)誤提示滯后。尤其是從DB查詢數(shù)據(jù)返回的是一個(gè)stdclass/array,獲取到的數(shù)據(jù)沒有對(duì)應(yīng)一個(gè)實(shí)體類,無法知道具體數(shù)據(jù)有哪些字段,需要通過查詢的sql語句,然后通過查看表結(jié)構(gòu)才能知道數(shù)據(jù)字段信息,這點(diǎn)很難受,影響開發(fā)效率
PHP現(xiàn)在已經(jīng)支持typehint,通過定義類型可以對(duì)部分確定的類型變量,參數(shù),返回類型進(jìn)行強(qiáng)類型的定義,尤其需要定義表數(shù)據(jù)Model類,這樣得到數(shù)據(jù)對(duì)象后通過->可以感知出所有數(shù)據(jù)字段,方便后續(xù)拓展開發(fā)和維護(hù)
根據(jù)場(chǎng)景使用,不能說因?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 select return 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; } }
通過定義變量類型得到代碼感知
/** @var Logic $logic */ $logic=new Logic();
因?yàn)镻HP是弱類型原因,在做類型比較的時(shí)候,往往會(huì)因?yàn)橐粋€(gè)不小心就掉坑里,下面列出類型函數(shù)和類型比較的表格
就問你,看到這些表格怕不怕,心中有一萬只草泥馬奔騰而過,瞬間變成幽怨的小眼神
使用 PHP 函數(shù)對(duì)變量 $x 進(jìn)行比較
表達(dá)式 | gettype() | empty() | is_null() | isset() | boolean : if($x) |
---|---|---|---|---|---|
$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 | FALSE | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" |
---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | FALSE | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" |
---|---|---|---|---|---|---|---|---|---|---|---|---|
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)兒暈,開發(fā)的時(shí)候需要特別注意下類型比較,對(duì)等比較盡量用"===",一些函數(shù)類型已經(jīng)能夠確定不會(huì)傳遞多類型參數(shù),就可以強(qiáng)制類型進(jìn)行限制,后面熟練度上來再看這個(gè)表格就感覺也還好,常用的類型之間的比較已經(jīng)深深的進(jìn)入到腦海中
IDE沒辦法給定義的變量進(jìn)行錯(cuò)誤提示,因?yàn)闆]有定義類型IDE也不清楚定義變量的類型,沒辦法做錯(cuò)誤提醒,往往需要在運(yùn)行的時(shí)候輸出到頁面上才能發(fā)現(xiàn)問題
PHP弱類型引發(fā)的漏洞實(shí)例
上面說了這么多弱類型下的問題,這里說下弱類型的優(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ù),等,通過這些特性可以用簡(jiǎn)單的代碼封裝出強(qiáng)大的功能
簡(jiǎn)單舉栗子:
name . ",發(fā)量:" . $this->hair; if (!empty($this->age)) $desc = $desc . ",年齡:" . $this->age; echo $desc . " "; } /** * 數(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 . " "; } // ------參數(shù)類型和返回值支持多類型------ $rs = $xf->handle(null); if ($rs === false) { echo "處理失敗"; } else { echo $rs; } // ------函數(shù)變量------ $fn = function () { echo "do something"; }; $fn();
PHP WEB服務(wù)端開發(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框架開發(fā)部署的WEB應(yīng)用服務(wù)也是內(nèi)存常駐
以往在C#開發(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è)最常見的的信息類型是錯(cuò)誤(error)、通知(notice)和警告(warning)。它們有不同的嚴(yán)重性: E_ERROR、E_NOTICE和E_WARNING。錯(cuò)誤是運(yùn)行期間的嚴(yán)重問題,通常是因?yàn)榇a出錯(cuò)而造成,必須要修正它,否則會(huì)使 PHP停止執(zhí)行。通知是建議性質(zhì)的信息,是因?yàn)槌绦虼a在執(zhí)行期有可能造成問題,但程序不會(huì)停止。 警告是非致命錯(cuò)誤,程序執(zhí)行也不會(huì)因此而中止。
PHP 可以控制錯(cuò)誤是否在屏幕上顯示(開發(fā)時(shí)比較有用)或隱藏記錄日志(適用于正式環(huán)境)
更改錯(cuò)誤報(bào)告行為:
# 方式1:配置php.ini error_reporting=E_ALL & ~E_NOTICE
//方式2:函數(shù)調(diào)用設(shè)置報(bào)錯(cuò)級(jí)別 error_reporting(E_ALL & ~E_NOTICE);
行內(nèi)錯(cuò)誤抑制:
錯(cuò)誤控制操作符 @ 來抑制特定的錯(cuò)誤。將這個(gè)操作符放置在表達(dá)式之前,其后的任何錯(cuò)誤都不會(huì)出現(xiàn)。
php的Error與Exception捕獲問題:
Error是檢測(cè)到的這個(gè)問題極有可能使程序無法繼續(xù)運(yùn)行,而Exception則是雖然有問題但是程序繼續(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 自己定義的方式來處理運(yùn)行中的錯(cuò)誤
set_exception_handler 設(shè)置默認(rèn)的異常處理程序,用于沒有用 try/catch 塊來捕獲的異常
連接池
涉及數(shù)據(jù)庫(kù)開發(fā)過程中一般都會(huì)用到連接池,通過使用連接池減少每次需要重新建立連接的時(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模式下目前比較合理的方式就是通過單例模式,保證在當(dāng)前請(qǐng)求操作下的數(shù)據(jù)連接只創(chuàng)建一個(gè)對(duì)象方式2:
可以通過swoole拓展實(shí)現(xiàn)數(shù)據(jù)連接池服務(wù),傳遞sql到服務(wù)里執(zhí)行返回?cái)?shù)據(jù),swoole內(nèi)存常駐,應(yīng)用客戶端連接斷開連接池服務(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
多帶帶配置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)度的,我們無法干預(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é)程,是無法做到并行的。
用戶態(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)用后,接下來內(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ù),從開發(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)訪問
gitlab release
預(yù)發(fā)環(huán)境
yf-app.sflyq.com
生產(chǎn)數(shù)據(jù)庫(kù)
公司內(nèi)網(wǎng)訪問
gitlab simulation
生產(chǎn)環(huán)境
app.sflyq.com
gitlab master
本地測(cè)試環(huán)境
通過docker部署
最近階段感悟從一個(gè)熟悉的語言到另一個(gè)相對(duì)陌生的語言,語言只是工具,在適合的場(chǎng)景下使用適合的工具,從自己熟悉的業(yè)務(wù)到陌生的業(yè)務(wù),離開自己的舒服區(qū),擁抱變化才能成長(zhǎng)
在相同的后端領(lǐng)域切換語言學(xué)習(xí)成本還是比較低的,主要是對(duì)后端開發(fā)的思路,經(jīng)驗(yàn)是可以共用的,只是換了個(gè)語言去實(shí)現(xiàn)
當(dāng)公司發(fā)展到一定的規(guī)模,崗位職能區(qū)分的很細(xì),做應(yīng)用開發(fā)的童鞋接觸不到服務(wù)器架構(gòu),沒有機(jī)會(huì)接觸職能以外的技術(shù),工作內(nèi)容除了完成業(yè)務(wù)需求開發(fā),還是業(yè)務(wù)需求開發(fā),這樣常年開發(fā)下去對(duì)個(gè)人成長(zhǎng)的局限性很高,需要自己在工作之余進(jìn)行拓展,對(duì)公司內(nèi)部有興趣的技術(shù)進(jìn)行了解和學(xué)習(xí),耐心等待機(jī)會(huì)的到來
在結(jié)尾重點(diǎn)說下作為開發(fā)應(yīng)該有的工作態(tài)度,感覺大部分開發(fā)參與項(xiàng)目普遍責(zé)任感和帶入感不強(qiáng),需求過來沒有多想,啪啪啪就是一梭子代碼,按照產(chǎn)品的邏輯流程碼了整個(gè)業(yè)務(wù)功能,功能測(cè)試上線可以正常運(yùn)行沒有問題,然后功成身退,兩耳不聞天下事,作為開發(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)目需求功能開發(fā)當(dāng)成造房子,需要分析業(yè)務(wù)需求提供合理的設(shè)計(jì)方案,適當(dāng)?shù)某橄蠛褪褂迷O(shè)計(jì)模式,只有在開發(fā)的時(shí)候把地基打穩(wěn)了才能保證后續(xù)的維護(hù)和拓展,避免技術(shù)債
2019年開年第一篇,祝大家和自己新的一年里豬事順利,大吉大利!歡迎Star 【大話WEB開發(fā)】
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30109.html
摘要:用來指向已創(chuàng)建好的實(shí)例構(gòu)造函數(shù)為空注意這里是關(guān)鍵這是我們需要調(diào)用的方法把函數(shù)也定義為空,這樣就大功告成啦。 接上一篇大話PHP設(shè)計(jì)模式之單例模式 這一篇介紹一下升級(jí)版的單例模式,廢話不說先上代碼 不完美的單例模式 class singleMode { //用來指向已創(chuàng)建好的實(shí)例 public static $instance; //判斷是...
摘要:上面是簡(jiǎn)單的單例模式,自己寫程序的話夠用了,如果想繼續(xù)延伸,請(qǐng)傳送至大話設(shè)計(jì)模式之單例模式升級(jí)版 看了那么多單例的介紹,都是上來就說怎么做,也沒見說為什么這么做的。那小的就來說說為什么會(huì)有單例這個(gè)模式以便更好的幫助初學(xué)者真正的理解這個(gè)設(shè)計(jì)模式,如果你是大神,也不妨看完指正一下O(∩_∩)O首先我不得不吐槽一下這個(gè)模式名字單例,初學(xué)者通過字面很難理解什么是單例,我覺得應(yīng)該叫唯一模式更貼切...
摘要:權(quán)限中心的依賴聲明聲明依賴關(guān)系檢查代碼規(guī)范聲明開發(fā)依賴命名空間檢查代碼規(guī)范,執(zhí)行單元測(cè)試。單元測(cè)試持續(xù)交付一切都如此的完美,沒有測(cè)試,又如何可以證明這件事情的完美,又如何可以保障交付的質(zhì)量。 序 權(quán)限管理是無線運(yùn)營(yíng)系統(tǒng)中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關(guān)系。 本文著重講解如何通過PHP來構(gòu)建一個(gè)靈活、通用、安全的權(quán)限管理系統(tǒng)。 關(guān)于權(quán)限 首先我們來聊聊權(quán)限。 權(quán)...
摘要:隨著業(yè)務(wù)的爆發(fā),團(tuán)隊(duì)人數(shù)迅速增長(zhǎng)起來,團(tuán)隊(duì)名也從前端開發(fā)部改名成體驗(yàn)技術(shù)部,意在體現(xiàn)前端工程師的核心競(jìng)爭(zhēng)力用技術(shù)解決產(chǎn)品體驗(yàn)問題。前后端分離的研發(fā)模式在社區(qū)流行起來,體驗(yàn)技術(shù)部最先實(shí)踐的是基于的應(yīng)用層方案。2008 年對(duì)中國(guó)人是復(fù)雜的一年,冰災(zāi),大地震,奧運(yùn)會(huì)接踵而至。對(duì)玉伯來說也一樣,趕在奧運(yùn)會(huì)排查臨時(shí)人口之前,玉伯從北京中科院軟件所離開,憑著自己幾年來在程序開發(fā)上的經(jīng)歷和對(duì)新興前端行業(yè)的...
摘要:時(shí)光飛逝,歲月如梭,我從前端開發(fā)崗位轉(zhuǎn)入測(cè)試崗位已經(jīng)三年了,這期間從迷茫到熟悉,到強(qiáng)化,到熟練,到總結(jié),感受還是很深的三年前的某一個(gè)晚上,我正準(zhǔn)備下班回家,我們的項(xiàng)目經(jīng)理把我叫到辦公司和我談話,談了很多,具體說什么不記得 ...
閱讀 2457·2021-11-23 09:51
閱讀 2058·2021-10-14 09:43
閱讀 2844·2021-09-27 13:35
閱讀 1221·2021-09-22 15:54
閱讀 2603·2021-09-13 10:36
閱讀 3952·2019-08-30 15:56
閱讀 3479·2019-08-30 14:09
閱讀 1796·2019-08-30 12:57