【类】变量复用,函数复用
變量復(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)題。
- 上一篇: mysql 两列互换
- 下一篇: 十 web爬虫讲解2—Scrapy框架