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

变量复用

变量复用,适用于以下场景: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.mzph.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…