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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

變量復(fù)用

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

場景1

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

<?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是整個項目都可以訪問的,可以添加更多的錯誤消息在里面。

?

場景2:

同一個類的兩個函數(shù)中間需要通信,我們需要對這種通信定義一下數(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ù)對參數(shù)進行了校驗,我們使用了一個用于通信的數(shù)據(jù)類型DataMeta,里面包含了我們所需要的結(jié)構(gòu)化數(shù)據(jù)。顯示定義DataMeta,是為了更好地理解。

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

總結(jié)下:

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

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

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

?

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

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

?

函數(shù)約束

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

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

我個人看法是:

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

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

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

代碼片段1:

實現(xiàn)interface時,未實現(xiàn)interface的函數(shù),會報錯。所以使用interface時,定義的函數(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í)行時,報錯: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();

這段代碼,沒問題,可以正常執(zhí)行。

?

代碼片段3:

如果interface的函數(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í)行時候報錯: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');

這段代碼沒問題,可正常執(zhí)行。

代碼片段5:

不再詳細(xì)展開,有興趣的自己動手實踐下之后的結(jié)論。

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

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

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

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

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

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

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

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

總結(jié)

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

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