日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【类】变量复用,函数复用

發(fā)布時(shí)間:2023/11/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【类】变量复用,函数复用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

變量復(fù)用

變量復(fù)用,適用于以下場(chǎng)景:1,整個(gè)項(xiàng)目公用的部分(比如errors);2,一組類要通信,或者同一個(gè)類的兩個(gè)函數(shù)之間要通信,通信數(shù)據(jù)可以用類來(lái)定義和約束;

場(chǎng)景1

所有錯(cuò)誤相關(guān)的部分要放在一個(gè)類里面,方便查找和使用;

<?php class errors {const ERROR_PARAMS = 'params error';const ERROR_EMPTY_PARAM = 'empty param'; }class TestModel {public function run(){ $error = errors::ERROR_PARAMS;var_dump($error);return $error;} }$model = new TestModel(); $model->run();

解釋,errors是整個(gè)項(xiàng)目都可以訪問(wèn)的,可以添加更多的錯(cuò)誤消息在里面。

?

場(chǎng)景2:

同一個(gè)類的兩個(gè)函數(shù)中間需要通信,我們需要對(duì)這種通信定義一下數(shù)據(jù)結(jié)構(gòu)。

<?php class DataMeta {public $mobile = '';public $message = ''; }class Sms {public function send($mobile, $message){ $data = new DataMeta();$data->mobile = $mobile;$data->message = $message;if ($this->checkValid($data)) {echo "Allow to send\n";} else {echo "Not allowed to send\n";} } public function checkValid(DataMeta $data){ if ($data->mobile && $data->message) {return true;} else {return false;}} }$model = new Sms(); $model->send(0, ''); $model->send(12345678910, 'my test');

checkValid函數(shù)對(duì)參數(shù)進(jìn)行了校驗(yàn),我們使用了一個(gè)用于通信的數(shù)據(jù)類型DataMeta,里面包含了我們所需要的結(jié)構(gòu)化數(shù)據(jù)。顯示定義DataMeta,是為了更好地理解。

當(dāng)然使用DataMeta這個(gè)類型是有些弊端的,如果這個(gè)數(shù)據(jù)結(jié)構(gòu)有很大的變動(dòng)(比如字段名相同,但實(shí)際的含義已經(jīng)變化了),那么用數(shù)組和注釋可能比DataMeta這樣的約束要更好一些。

總結(jié)下:

情況1,有一組數(shù)據(jù),需要在函數(shù)間傳遞,并且結(jié)構(gòu)不會(huì)有變化的;辦法是:可以定義一個(gè)MetaClass來(lái)約束這組數(shù)據(jù)。

情況2,有一組數(shù)據(jù),需要在函數(shù)間傳遞,但是結(jié)構(gòu)會(huì)經(jīng)常性變化,則不能使用MetaClass來(lái)約束;辦法是:用數(shù)組和注釋來(lái)說(shuō)明;特別地,Stdclass也適合這個(gè)場(chǎng)景;

情況3,有一組數(shù)據(jù),需要在函數(shù)間傳遞,結(jié)構(gòu)上只會(huì)新增字段,原始字段含義保持;辦法是:依然可以用MetaClass來(lái)約束。

?

以上解釋了PHP之間傳遞某個(gè)有結(jié)構(gòu)約束的變量,可以有的方法。

除此之外,我們希望關(guān)心,有些類是完成類似的功能,也遵循一些共同的動(dòng)作,這些類的函數(shù)名是一致的。

?

函數(shù)約束

函數(shù)約束的解決方案:1,基類派生類;2,接口interface。

如何區(qū)分哪種場(chǎng)景下使用基類派生類,哪種場(chǎng)景下使用interface。

我個(gè)人看法是:

1,如果能用接口實(shí)現(xiàn)最好優(yōu)先使用接口,繼承盡量不要使用;

2,接口只定義約束,并不包含實(shí)現(xiàn),所以各個(gè)類動(dòng)作很不相同,只用接口來(lái)約束需要實(shí)現(xiàn)的函數(shù)即可(大多數(shù)的業(yè)務(wù)代碼就是很不同,用接口比較ok);

3,如果基類已經(jīng)有完整的功能,派生類需要自己個(gè)性化完成的動(dòng)作并不太多,使用基類繼承類。

代碼片段1:

實(shí)現(xiàn)interface時(shí),未實(shí)現(xiàn)interface的函數(shù),會(huì)報(bào)錯(cuò)。所以使用interface時(shí),定義的函數(shù)是必須實(shí)現(xiàn)的。

<?php interface SmsInterface {public function sendSms($abc); }class m1 implements SmsInterface {public function sendSms($aaa = 'cc'){var_dump(__CLASS__);} }class m2 implements SmsInterface {public function __construct(){var_dump(__CLASS__);} }$a = new m1(); $a->sendSms(); $b = new m2();

執(zhí)行時(shí),報(bào)錯(cuò):Fatal error: Class m2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (SmsInterface::sendSms) in

?

代碼片段2:

interface定義的函數(shù)不攜帶參數(shù)。

<?php interface SmsInterface { public function sendSms(); } class m1 implements SmsInterface {public function sendSms(){var_dump(__CLASS__);} } class m2 implements SmsInterface { public function __construct(){var_dump(__CLASS__);}public function sendSms(){var_dump(__CLASS__);} }$a = new m1(); $a->sendSms();$b = new m2(); $b->sendSms();

這段代碼,沒(méi)問(wèn)題,可以正常執(zhí)行。

?

代碼片段3:

如果interface的函數(shù)是攜帶參數(shù)的,那么實(shí)現(xiàn)類必須是和interface的函數(shù)原型保持一致,也需要攜帶參數(shù)才可以。

<?php interface SmsInterface {public function sendSms($mobile, $message); }class m1 implements SmsInterface {public function sendSms(){var_dump(__CLASS__);} }$a = new m1(); $a->sendSms();

執(zhí)行時(shí)候報(bào)錯(cuò):Fatal error: Declaration of m1::sendSms() must be compatible with SmsInterface::sendSms($mobile, $message)

代碼片段4:

<?php interface SmsInterface {public function sendSms($mobile, $message); }class m1 implements SmsInterface {public function sendSms($mobile, $message){var_dump(__CLASS__);} }$a = new m1(); $a->sendSms(123, 'message');

這段代碼沒(méi)問(wèn)題,可正常執(zhí)行。

代碼片段5:

不再詳細(xì)展開(kāi),有興趣的自己動(dòng)手實(shí)踐下之后的結(jié)論。

關(guān)于默認(rèn)參數(shù):

a,如果interface的函數(shù)有默認(rèn)參數(shù),實(shí)現(xiàn)類也必須實(shí)現(xiàn)自己的函數(shù),所以interface的默認(rèn)參數(shù)并不起作用;

b,實(shí)現(xiàn)類如果有默認(rèn)參數(shù),調(diào)用時(shí)候走默認(rèn)參數(shù)邏輯沒(méi)問(wèn)題;

關(guān)于參數(shù)列表不一致:

如果實(shí)現(xiàn)類的參數(shù)列表比interface定義的要少,是會(huì)報(bào)錯(cuò)的;

如果實(shí)現(xiàn)類的參數(shù)列表比interface定義的要多,語(yǔ)法上不會(huì)報(bào)錯(cuò),也可以使用,另外的解決方案是setField()這樣的set函數(shù);

轉(zhuǎn)載于:https://www.cnblogs.com/helww/p/8176519.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【类】变量复用,函数复用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。