变量复用

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

【类】变量复用,函数复用相关推荐

  1. mosn 中的context、变量 和 内存复用机制

    mosn 中的context.变量 和 内存复用机制 在梳理变量机制中,发现与context.对象复用等机制都有一定关联,而context是贯穿始终的关键,所以本来只想记录变量机制,结果对contex ...

  2. [AE 表达式]函数复用技巧

    声明:我写的[AE 表达式]文章都是原创,包括文字和图片请不要以任何形式进行转载. 在 After Effects 中,表达式复用是比较麻烦的,因为表达式的作用域是当前属性,因此无法在其它位置引用,A ...

  3. python 如何查看模块所有方法-Python查看模块(变量、函数、类)方法

    前面章节中,详细介绍了模块和包的创建和使用(严格来说,包本质上也是模块),有些读者可能有这样的疑问,即正确导入模块或者包之后,怎么知道该模块中具体包含哪些成员(变量.函数或者类)呢? 查看已导入模块( ...

  4. scala tail recursive优化,复用函数栈

    在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高.If a function c ...

  5. 【Python面试】 说说Python变量、函数、类的命名规则?

    往期面试题: 谈谈对 Python 和其他语言的区别? 说说4种常用编码的区别? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 废话不多说,开始今天的题目: 问:Python ...

  6. I/O复用函数的使用——epoll

    1.epoll的接口介绍 epoll 是 Linux 特有的 I/O 复用函数.它在实现和使用上与 select.poll 有很大差异.首先,epoll 使用一组函数来完成任务,而不是单个函数.其次, ...

  7. less简介、less安装、编译、less语法之变量、嵌套、类混入、函数混入、运算、less文件导入

    less基础: CSS是一门非程序语言,没有变量.函数.作用域等,此时使用rem单位就会出现图片等大量计算尺寸的问题,但是less可以轻松实现运算,它是CSS预处理语言,引入了变量.混入.函数等,常见 ...

  8. 类的静态成员函数和静态成员变量的使用

    当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关. ...

  9. python一个函数调用另一个函数中的变量_在Python 中同一个类两个函数间变量的调用方法...

    在Python 中同一个类两个函数间变量的调用方法 更新时间:2019年01月31日 15:44:54 作者:wxy_summer 今天小编就为大家分享一篇在Python 中同一个类两个函数间变量的调 ...

  10. Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数

    探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...

最新文章

  1. 傅里叶卷积实现「万物隐身」,这个神器可试玩
  2. 【Java源码分析】LinkedHashSet和HashSet源码分析
  3. Java 和Ajax的简单结合
  4. 2021高考成绩查询省排名,重磅!2021全国各地高考预测分数线出炉,这样估分可以估算全省排名...
  5. python正则表达式试题_正则表达式练习题2
  6. Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp
  7. 前端学习(1936)vue之电商管理系统电商系统之再关闭对话框defkeys
  8. 2021安新中学高考成绩查询,石家庄二中雄安校区•河北安新中学2019届冲刺高考百日誓师大会...
  9. Android实现传感器应用及位置服务
  10. VS-C++ 调试----调试信息输出至调试器(输出界面)
  11. 动视暴雪利润下降22%,投身移动端能否重回王座?
  12. 大数据网站汇总(数据搜集、大数据竞赛、)
  13. C语言中圆的周长怎么算,圆的周长公式 周长怎么算出来的
  14. ArcGIS基础:面数据空洞填充的方法
  15. idea中java版本设置
  16. 简单的sql语句及例子
  17. iOS在UIButton中换行
  18. VBS 请求WebAPI接口_如何设计WEB API
  19. WordPress博客系统搜索引擎优化seo全攻略方法
  20. 学习C语言必备:VsCode c++/c语言 环境配置(易懂)

热门文章

  1. python import 类 继承_python学习之类的继承
  2. python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...
  3. 哈密尔顿算法matlab,复杂制造过程最优哈密尔顿圈算法的MATLAB仿真与分析.doc
  4. 标题 计算机构自由度时主要步骤有哪些,2010年1月全国自考混凝土结构设计试题和答案...
  5. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
  6. 二进制搜索树_将排序的数组转换为二进制搜索树
  7. 端口复用和重映射--STM32F103
  8. 计算机编程输入与输出,计算机编程语言的发展与输入输出设备的使用
  9. [Linux]vi/vim下添加多行注释和取消注释
  10. c++的STL--1概念通述