您好,登錄后才能下訂單哦!
近期因公司內(nèi)部轉(zhuǎn)崗,開(kāi)始參與PHP項(xiàng)目進(jìn)行后端開(kāi)發(fā),一直都是強(qiáng)類型寫(xiě)的比較多,弱類型語(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)整,尤其在性能上有很大的提升
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ū)ο?,最早PHP版本不支持面向?qū)ο筇匦裕琍HP5開(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ū)ο?,根?jù)具體的業(yè)務(wù)場(chǎng)景設(shè)計(jì)
使用composer psr4
{
"autoload": {
"psr-4": {
"Library\\": "library/"
}
}
}
composer install
include_once "vendor/autoload.php";
composer dump-autoload -o
在剛學(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)力型就把所有類型定義都寫(xiě)成強(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;
}
}
通過(guò)定義變量類型得到代碼感知
/** @var Logic $logic */
$logic=new Logic();
因?yàn)镻HP是弱類型原因,在做類型比較的時(shí)候,往往會(huì)因?yàn)橐粋€(gè)不小心就掉坑里,下面列出類型函數(shù)和類型比較的表格
就問(wèn)你,看到這些表格怕不怕,心中有一萬(wàn)只草泥馬奔騰而過(guò),瞬間變成幽怨的小眼神
使用 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)兒暈,開(kāi)發(fā)的時(shí)候需要特別注意下類型比較,對(duì)等比較盡量用'===',一些函數(shù)類型已經(jīng)能夠確定不會(huì)傳遞多類型參數(shù),就可以強(qiáng)制類型進(jìn)行限制,后面熟練度上來(lái)再看這個(gè)表格就感覺(jué)也還好,常用的類型之間的比較已經(jīng)深深的進(jìn)入到腦海中
上面說(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)單舉栗子:
<?php
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();
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)存常駐
以往在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
//方式2:函數(shù)調(diào)用設(shè)置報(bào)錯(cuò)級(jí)別
error_reporting(E_ALL & ~E_NOTICE);
行內(nèi)錯(cuò)誤抑制:
錯(cuò)誤控制操作符 @ 來(lái)抑制特定的錯(cuò)誤。將這個(gè)操作符放置在表達(dá)式之前,其后的任何錯(cuò)誤都不會(huì)出現(xiàn)。
<?php echo @$var['sflyq'];
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
涉及數(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)回收
線程(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ù)
線程是由操作系統(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í)行的是我們編寫(xiě)的應(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)的
服務(wù)部署:
代碼托管和測(cè)試環(huán)境:
均使用阿里云服務(wù)器,代碼托管自建gitlab服務(wù),從開(kāi)發(fā)分支合并到gitlab環(huán)境分支自動(dòng)部署到對(duì)應(yīng)環(huán)境服務(wù)器上
從一個(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ā)】
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。