【类】变量复用,函数复用
变量复用
变量复用,适用于以下场景: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
【类】变量复用,函数复用相关推荐
- mosn 中的context、变量 和 内存复用机制
mosn 中的context.变量 和 内存复用机制 在梳理变量机制中,发现与context.对象复用等机制都有一定关联,而context是贯穿始终的关键,所以本来只想记录变量机制,结果对contex ...
- [AE 表达式]函数复用技巧
声明:我写的[AE 表达式]文章都是原创,包括文字和图片请不要以任何形式进行转载. 在 After Effects 中,表达式复用是比较麻烦的,因为表达式的作用域是当前属性,因此无法在其它位置引用,A ...
- python 如何查看模块所有方法-Python查看模块(变量、函数、类)方法
前面章节中,详细介绍了模块和包的创建和使用(严格来说,包本质上也是模块),有些读者可能有这样的疑问,即正确导入模块或者包之后,怎么知道该模块中具体包含哪些成员(变量.函数或者类)呢? 查看已导入模块( ...
- scala tail recursive优化,复用函数栈
在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高.If a function c ...
- 【Python面试】 说说Python变量、函数、类的命名规则?
往期面试题: 谈谈对 Python 和其他语言的区别? 说说4种常用编码的区别? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 废话不多说,开始今天的题目: 问:Python ...
- I/O复用函数的使用——epoll
1.epoll的接口介绍 epoll 是 Linux 特有的 I/O 复用函数.它在实现和使用上与 select.poll 有很大差异.首先,epoll 使用一组函数来完成任务,而不是单个函数.其次, ...
- less简介、less安装、编译、less语法之变量、嵌套、类混入、函数混入、运算、less文件导入
less基础: CSS是一门非程序语言,没有变量.函数.作用域等,此时使用rem单位就会出现图片等大量计算尺寸的问题,但是less可以轻松实现运算,它是CSS预处理语言,引入了变量.混入.函数等,常见 ...
- 类的静态成员函数和静态成员变量的使用
当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关. ...
- python一个函数调用另一个函数中的变量_在Python 中同一个类两个函数间变量的调用方法...
在Python 中同一个类两个函数间变量的调用方法 更新时间:2019年01月31日 15:44:54 作者:wxy_summer 今天小编就为大家分享一篇在Python 中同一个类两个函数间变量的调 ...
- Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数
探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...
最新文章
- 傅里叶卷积实现「万物隐身」,这个神器可试玩
- 【Java源码分析】LinkedHashSet和HashSet源码分析
- Java 和Ajax的简单结合
- 2021高考成绩查询省排名,重磅!2021全国各地高考预测分数线出炉,这样估分可以估算全省排名...
- python正则表达式试题_正则表达式练习题2
- Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp
- 前端学习(1936)vue之电商管理系统电商系统之再关闭对话框defkeys
- 2021安新中学高考成绩查询,石家庄二中雄安校区•河北安新中学2019届冲刺高考百日誓师大会...
- Android实现传感器应用及位置服务
- VS-C++ 调试----调试信息输出至调试器(输出界面)
- 动视暴雪利润下降22%,投身移动端能否重回王座?
- 大数据网站汇总(数据搜集、大数据竞赛、)
- C语言中圆的周长怎么算,圆的周长公式 周长怎么算出来的
- ArcGIS基础:面数据空洞填充的方法
- idea中java版本设置
- 简单的sql语句及例子
- iOS在UIButton中换行
- VBS 请求WebAPI接口_如何设计WEB API
- WordPress博客系统搜索引擎优化seo全攻略方法
- 学习C语言必备:VsCode c++/c语言 环境配置(易懂)
热门文章
- python import 类 继承_python学习之类的继承
- python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...
- 哈密尔顿算法matlab,复杂制造过程最优哈密尔顿圈算法的MATLAB仿真与分析.doc
- 标题 计算机构自由度时主要步骤有哪些,2010年1月全国自考混凝土结构设计试题和答案...
- 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
- 二进制搜索树_将排序的数组转换为二进制搜索树
- 端口复用和重映射--STM32F103
- 计算机编程输入与输出,计算机编程语言的发展与输入输出设备的使用
- [Linux]vi/vim下添加多行注释和取消注释
- c++的STL--1概念通述