【類】變量復用,函數復用

變量復用

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

場景1

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

<?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:

同一個類的兩個函數中間需要通信,我們需要對這種通信定義一下數據結構。

<?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函數對參數進行了校驗,我們使用了一個用于通信的數據類型DataMeta,里面包含了我們所需要的結構化數據。顯示定義DataMeta,是為了更好地理解。

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

總結下:

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

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

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

?

以上解釋了PHP之間傳遞某個有結構約束的變量,可以有的方法。

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

?

函數約束

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

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

我個人看法是:

1,如果能用接口實現最好優先使用接口,繼承盡量不要使用;

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

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

代碼片段1:

實現interface時,未實現interface的函數,會報錯。所以使用interface時,定義的函數是必須實現的。

<?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();

執行時,報錯:Fatal error: Class m2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (SmsInterface::sendSms) in

?

代碼片段2:

interface定義的函數不攜帶參數。

<?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();

這段代碼,沒問題,可以正常執行。

?

代碼片段3:

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

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

執行時候報錯: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');

這段代碼沒問題,可正常執行。

代碼片段5:

不再詳細展開,有興趣的自己動手實踐下之后的結論。

關于默認參數:

a,如果interface的函數有默認參數,實現類也必須實現自己的函數,所以interface的默認參數并不起作用;

b,實現類如果有默認參數,調用時候走默認參數邏輯沒問題;

關于參數列表不一致:

如果實現類的參數列表比interface定義的要少,是會報錯的;

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

轉載于:https://www.cnblogs.com/helww/p/8176519.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390435.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python練習_如何使用Logzero在Python中練習記錄

python練習Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 and 3. Logzero makes it easier as a print statement to show information and debugging details.Logzero是Chris Hager創建的Python程序包&#xff0c;它簡化了Pytho…

1736. 替換隱藏數字得到的最晚時間

給你一個字符串 time &#xff0c;格式為 hh:mm&#xff08;小時&#xff1a;分鐘&#xff09;&#xff0c;其中某幾位數字被隱藏&#xff08;用 ? 表示&#xff09;。 有效的時間為 00:00 到 23:59 之間的所有時間&#xff0c;包括 00:00 和 23:59 。 替換 time 中隱藏的數…

電腦棒安裝linux_為什么要使用Linux? Linux很棒的11個理由

電腦棒安裝linuxIn this article, well look at some of the things developers love about Linux so you can decide if its right for you.在本文中&#xff0c;我們將研究開發人員對Linux的一些喜愛&#xff0c;以便您可以確定它是否適合您。 持續有效的改進。 (Constant a…

1743. 從相鄰元素對還原數組

存在一個由 n 個不同元素組成的整數數組 nums &#xff0c;但你已經記不清具體內容。好在你還記得 nums 中的每一對相鄰元素。 給你一個二維整數數組 adjacentPairs &#xff0c;大小為 n - 1 &#xff0c;其中每個 adjacentPairs[i] [ui, vi] 表示元素 ui 和 vi 在 nums 中相…

十 web爬蟲講解2—Scrapy框架爬蟲—Scrapy安裝—Scrapy指令

Scrapy框架安裝 1、首先&#xff0c;終端執行命令升級pip: python -m pip install --upgrade pip2、安裝&#xff0c;wheel(建議網絡安裝) pip install wheel3、安裝&#xff0c;lxml(建議下載安裝)4、安裝&#xff0c;Twisted(建議下載安裝)5、安裝&#xff0c;Scrapy(建議網絡…

阿里與珠海橫琴新區達成戰略合作,阿里云助力打造橫琴智能島

5月17日&#xff0c;阿里巴巴集團、螞蟻金服集團與珠海橫琴新區管理委員會簽署戰略合作協議&#xff0c;三方將圍繞云計算、政務民生服務、城市治理、電子商務等領域展開深入合作&#xff0c;推動橫琴產業發展&#xff0c;共同建設新型智慧城市。 &#xff08;阿里巴巴集團、螞…

chrome 開發工具_我最喜歡的Chrome開發工具提示和技巧

chrome 開發工具Chrome Developer Tools are a super powerful suite of tools for developing web applications. They can do so much, from very basic operations like traversing the DOM, to checking out network requests or even profiling your applications perform…

三十四 Python分布式爬蟲打造搜索引擎Scrapy精講—scrapy信號詳解

信號一般使用信號分發器dispatcher.connect()&#xff0c;來設置信號&#xff0c;和信號觸發函數&#xff0c;當捕獲到信號時執行一個函數 dispatcher.connect()信號分發器&#xff0c;第一個參數信號觸發函數&#xff0c;第二個參數是觸發信號&#xff0c; 以下是各種信號 sig…

1713. 得到子序列的最少操作次數

給你一個數組 target &#xff0c;包含若干 互不相同 的整數&#xff0c;以及另一個整數數組 arr &#xff0c;arr 可能 包含重復元素。 每一次操作中&#xff0c;你可以在 arr 的任意位置插入任一整數。比方說&#xff0c;如果 arr [1,4,1,2] &#xff0c;那么你可以在中間添…

CVE-2018-1000136:Electron nodeIntegration繞過漏洞

1周前&#xff0c;研究人員發現一個影響Electron所有版本的漏洞&#xff0c;利用該漏洞可以開啟nodeIntegration&#xff0c;這可能會造成遠程代碼執行。Electron是一個使用JavaScript,HTML和CSS等Web技術創建原生程序的框架&#xff0c;它負責比較難搞的部分&#xff0c;而用戶…

bash腳本 文件_如何使用Bash腳本來管理從AWS S3存儲桶下載和查看文件

bash腳本 文件As you can read in this article, I recently had some trouble with my email server and decided to outsource email administration to Amazons Simple Email Service (SES). 正如您在本文中所讀到的 &#xff0c;最近我的電子郵件服務器遇到了一些麻煩&…

rsync(六)命令中文手冊

rsync(1) rsync(1)名稱rsync - 一個快速、多功能的遠程(和本地)文件拷貝工具摘要Local: rsync [OPTION...] SRC... [DEST]Access via remote shell:Pull: rsync [OPTION...] [USE…

NFS共享存儲服務部署

服務端部署 1、檢查服務器上是否已安裝nfs及rpc&#xff0c;沒有則需要安裝檢查rpm -qa rpcbind nfs-utils安裝&#xff08;已安裝略過&#xff09;yum install -y rpcbind nfs-utils################################################################2、編寫nfs的配置文件cat…

區塊鏈運作機制_什么是區塊鏈及其運作方式?

區塊鏈運作機制If youre interested in technology, theres a good chance you’ve probably heard the terms Bitcoin, Crypto, Ethereum, or even "distributed, decentralized ledgers."如果您對技術感興趣&#xff0c;那么您很有可能已經聽說過比特幣&#xff0c…

敏捷管理之績效考核方案

前段時間&#xff0c;公司簽了年終獎確認。覺得公司發放年終獎完全是憑主觀發放&#xff0c;沒有事實依據&#xff0c;由此產生了對如何發放年終獎的一些想法。 獎金發放作為激勵員工最直接的手段&#xff0c;往往也是讓管理人員最難抉擇的&#xff0c;而且很多公司&#xff0c…

序言

為什么要寫這篇文章&#xff1f; 說起架構&#xff0c;剛入行的新人覺得是高大上的技術&#xff0c;有工作經驗的一些人又覺得是虛無縹緲的東西&#xff0c;不能落實。具體有用沒用&#xff0c;我不給答案&#xff0c;想通過寫這么一個例子來還原場景&#xff0c;讓讀者自己判斷…

kotlin編程語言_Kotlin初學者編程基礎

kotlin編程語言什么是Kotlin&#xff1f; (What is Kotlin?) Kotlin is a programming language developed by Jetbrains, the company behind some of the world’s most popular IDEs like IntelliJ and Pycharm.Kotlin是Jetbrains開發的一種編程語言&#xff0c;該公司是In…

記一個蒟蒻的絕望

感覺現在…… 怎么講&#xff0c;心挺冷的。 今天一月五號了。距離省選&#xff0c;時間好短啊。 我還有那么多東西不懂。甚至聽都沒聽說過。 等到真正去省選的時候&#xff0c;我可能跟現在一樣&#xff0c;什么都不會。 我的名字能不能被看到都不知道。哈&#xff0c;還進隊呢…

671. 二叉樹中第二小的節點

給定一個非空特殊的二叉樹&#xff0c;每個節點都是正數&#xff0c;并且每個節點的子節點數量只能為 2 或 0。如果一個節點有兩個子節點的話&#xff0c;那么該節點的值等于兩個子節點中較小的一個。 更正式地說&#xff0c;root.val min(root.left.val, root.right.val) 總…

CentOS查詢端口占用和清除端口占用的程序

1、查詢端口號占用&#xff0c;根據端口查看進程信息 [rootserver2 ~]# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEhttpd 5014 root 3u IPv4 14346 TCP server2:http (LISTEN)2、根據進程號查看進程對應的可執行程序 ps -f -p 進程號# p…