1.面向对象类是属性和方法的集合, PHP的对象是用数组来模拟的。序列化对象后,存储的只是对象的属性。类是由属性和方法组成的,而对象则是属性的集合。由同一个类生成的不同对象,拥有不同的属性,
但共享了类的代码空间中方法区域的代码。在PHP5中,对象在底层的实现是采用 '属性数组 + 方法数组' 来实现的。对象的组成 :1.属性数组2.类指针1.类属性2.静态属性3.类常量4.标准方法5.魔术方法6.自定义方法列表对象与数组的区别在于:对象还有个指针,指向了它所属的类。序列化后的对象会附带所属的类名,这个类名保证此对象能够在执行类的方法时,能够正确的找到方法所在的代码空间(即对象所拥有的方法存储在类里面)。另外,当一个对象的实例变量引用其他对象时,序列化该对象时也会对引用对象进行序列化。1.类是定义一些列属性和操作的模板,而对象则把属性进行具体化,然后交给类处理。2.对象就是数据,对象本身不包含方法。但是对象有一个'指针'指向一个类,这个类里可以有方法。3.方法描述不同属性所导致的不同表现。4.类和对象是不可分割的,有对象就必定有一个类和其对应。耦合是一个软件结构内不同模块之间互连程度的度量,也就是不同模块之间的依赖关系。解耦是要接触模块与模块之间的依赖。继承与组合更倾向使用组合,为什么呢?1.继承破坏封装性鸟类为父类,但其子类鸭子等不需要飞翔这个方法,但却可以无区别的使用。2.继承是耦合的继承使得子类和父类捆绑在一起,组合仅通过唯一接口和外部进行通信。3.继承扩展复杂   随着继承层数的增加和子类的增加,将涉及大量方法重写。使用组合,可以根据类型约束,实现动态组合,减少代码。4.不恰当的使用继承可能违反现实世界的逻辑组合的缺点:在创建组合对象的时候,组合需要一一创建局部对象。组合比继承增加了代码量。继承最大的优点是扩展简单。如何使用继承?1.精心设计专门用于被继承的类,继承树的抽象层应该比较稳定,一般不要多于3层。2.对于不是专门用于被继承的类,禁止其被继承,也就是使用 final 修饰符。使用 final 修饰符即可防止重要方法被非法覆盖,又能给编译器寻找优化的机会。1.优先考虑组合关系提高代码的可重用性2.子类是一个特殊的类型,而不只是父类的一个角色3.子类扩展,而不是覆盖或者使用父类的功能失效4.底层代码多用组合,顶层/业务层代码多用继承。底层用组合可以提高效率,避免对象臃肿。顶层代码用继承可以提高灵活性,让业务更方便。如果既要组合的灵活,又要继承的代码简洁?使用多重继承。一个类可以同时继承多个父类,组合两个父类的功能。PHP 5.4 引入的 traits 可以方便我们实现对象的扩展,是除 extend, implements 外的另外一种扩展对象的方式。2.多态同一类的对象收到相同消息时,会得到不同的结果。多态性是一种通过多种状态或阶段描述相同对象的编程方式。它真正的意义在于:实际开发中,只要关系一个接口或基类的编程,而不必关心一个对象所属的具体类。PHP 作为一门脚本语言,本身就是多态的。C++ 中的多态,定义一个父类,然后定义一个子类,这个子类继承父类的一些方法并且有自己的方法。通过 father *pf = new son; 语句创建一个派生类(子类)对象,并且把该派生类对象赋值给基类(父类)指针,然后用该指针访问父类中的 eat 和 run 方法。由于父类中的 run 方法加了 virtual 关键字,表示该函数有多种状态,可能被多个对象所拥有。也就是说,多个对象在调用同一名字的函数时会产生不同的效果。和 PHP 有什么不同呢?C++ 的这个例子所创建的对象是一个指向父类的子对象,还可以创建更多的派生类,然后上转型为父类对象。这些对象,都是同一类对象,但是在运行时,却都能调用到派生类同名函数。而PHP中的例子则是不同类的对象调用。由于PHP是弱类型,并且也没有对象转型机制,所有不能像C++那样实现 father *pf = new son; 把派生类对象赋给基类对象,然后在调用的时候动态的改变其指向。在PHP中,对象是确定的,是不同类的对象。所以,从这个角度看,不是真正的多态。区别多态的关键在于看对象是否属于同一类型。如果把它们看做同一种类型,调用了相同函数,返回了不同结果,那么它就是多态。否则,不是称其为多态。1.多态指同一类对象在运行时的具体化2.PHP语言是弱类型,实现多态更简单3.类型转换不是多态4.PHP中父类和子类看做 '继父'和'继子' 关系,它们存在继承关系,不存在血缘关系。因此子类无法向上转型为父类,从而失去多态的最典型特征。5.多态的本质就是 if...else,只不过实现的层级不同。3.面向接口编程接口定义一套规范,描述一个'物'的功能。采用一个特定接口的所有代码都知道对于那个接口会调用什么方法。这便是接口的全部含义。接口通常作为类与类之间的一个'协议'。接口是抽象类的变体,接口中所有的方法都是抽象的,没有一个程序体。接口除了可以包含方法外,还可以包含常量。接口为抽象而生,接口是一种契约。大型项目中,核心开发人员和技术经理编写核心的流程和代码,以接口形式给出。而基础开发人员,指针对这些接口,填充代码,如数据库操作等。这样,核心人员把更多精力投入到了技术公关和业务逻辑中。前端只针对接口编程,只管在 Action 层调用 Service,不管实现细节。而后端则负责Dao和 Service层接口的实现。为什么一个类实现了 Iterator 迭代器,其对象就可以被用作 foreach 呢。原因是,在对 PHP 实例对象使用 foreach 时,会检查这个实例有没有实现Iterator 接口,如果实现了,就会通过内置方法或者使用实现类中的方法模拟 foreach语句。这和 __toString() 很像,事实上,__toString()方法就是接口的一种变相实现。接口是对多重继承的一种变相实现,trait 可以被视为一种加强型接口。trait 和接口很像,不同的是 trait 是可以导入包含代码的接口。4.反射面向对象编程中对象被赋予了自身的能力,而这个自身的过程就是反射。反射,直观理解就是根据到达地找到出发地和来源。反射指在 PHP 运行状态中,扩展分析 PHP 程序,到处或提取关于类,方法,属性,参数等详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能被称为反射 API。反射的作用:反射可以用于生成文档。因此它可以对文件里的类进行扫描,逐个生成描述文档。既然反射可以探知类的内部结构,那么是不是可以用它做 hook 实现插件功能?或者是做动态代理呢?
<?phpclass mysql
{public function connect($db){echo '连接到数据库 db';}
}class sqlproxy
{private $target;public function __construct($tar){$this->target[] = new $tar();}public function __call($name, $arguments){foreach ($this->target as $obj) {$r = new ReflectionClass($obj);if ($method = $r->getMethod($name)) {if ($method->isPublic() && !$method->isAbstract()) {echo '方法前拦截记录';$method->invoke($obj, $args);echo '方法后拦截';}}}}
}$obj = new sqlproxy('mysql');
$obj->connect('member');这里真正操作的类是 mysql,但是 sqlproxy 类实现了根据动态传入参数,代替实际的类运行,并且在方法前后进行拦截,并且动态的改变了方法和属性。这就是简单的动态代理。反射的消耗很大。反射可以保持代码的优雅和简洁,但反射也会破坏类的封装性,因为暴露了方法和属性。5.错误和异常PHP 里的异常,是程序运行中不符合预期的情况以及正常流程不同的状况。异常和错误是2个不同的概念。PHP 只有手动抛出异常后才能捕获异常。下面3种场景用到异常:1.对程序的悲观预测2.程序的需要和对业务的关注3.语言级别的健壮性要求PHP 的错误级别:1.deprecated2.notice3.warning4.fetal5.parse errorset_error_handler();trigger_error();

1.1 对象的本

1.PHP核心技术与最佳实践 --- 面向对象思想的核心概念相关推荐

  1. php mobi_PHP核心技术与最佳实践 mobi epub

    内容简介:PHP核心技术与最佳实践,国产php web开发经典教程,php,mysql 本书一共有14章.每章节都可以单独阅读,由于部分知识点之间存在一定的衔接,故建议按先后顺序阅读. 第1章 为面向 ...

  2. PHP 核心技术与最佳实践

    货刚到,分享一波! 点击书名进行提取,密码:gpb5 书籍:<PHP 核心技术与最佳实践>

  3. kindle版java核心_深入理解java 7 核心技术与最佳实践-成富[6寸pdf mobi epub kindle版].pdf...

    深入理解java 7 核心技术与最佳实践-成富[6寸pdf mobi epub kindle版].pdf 还剩 50页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预 ...

  4. python的核心理念是什么_Python 面向对象编程的核心概念知识点简介

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于 无量测试之道 ,作者: 无量测试之道 刚接触Python的新手.小白,可以复制下面 ...

  5. spring 2.0核心技术与最佳实践 pdf_推荐 Spring Boot 实践学习案例大全 数据缓存 和中间件 安全权限...

    概况 spring boot 实践学习案例 spring boot 初学者及核心技术巩固的最佳实践 目录 『 Spring Boot 2 快速教程 』 Spring Boot 2:WebFlux集成 ...

  6. 图计算思维与实践 (二)核心概念与算法

    前言 在前文<图计算思维与实践 (一)概览>中,我们介绍了以知识图谱.网络分析为主的图计算的应用,阐述了图思维的方式.本文我们将进入第二部分:图相关的核心概念与算法,这些是进行图探索的基础 ...

  7. 应用数据流状态管理框架Redux简介、设计思想、核心概念及工作流

    tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( 'ω' )و [本文源址:http://blog.csdn.net/q1056843325/article/details/54784109 ...

  8. PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 面向对象的设计原则 2.1 面向对象设计的五大原则 单一职责原则 接口隔离原则 开放-封闭原则 替换原则 依赖倒置原则 ...

  9. php核心技术与最佳实践 --- 错误与异常

    <?php /*php error*/ /** 异常和错误的概念不一样* 在PHP里,遇到任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,会同时抛出异常和错误)* 异常处理机制就是把 ...

  10. 读《Spring Boot 3核心技术与最佳实践》有感

    我是谁?

最新文章

  1. 如何在 Linux 上用 Markdown 编写电影剧本
  2. 并非所有图像都值16x16个词--- 清华华为提出一种自适应序列长度的动态ViT
  3. torch.nn.Linear
  4. nginx日志切割定时执行脚本
  5. python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间的方法
  6. OpenGL多光源Multiple lights
  7. POJ 1655 Balancing Act (树的重心)
  8. powershell自动化操作AD域、Exchange邮箱系列(3)—重要的模块/API介绍Get-Aduser Get-Mailbox
  9. 任务之间的依赖(NSOperation)
  10. python是什么软件-软件开发是什么?
  11. Ubuntu下对executable (application/x-executable)文件创建快捷方式
  12. java中spring的注解_Java代码中spring注解浅析
  13. Kali学习 | 密码攻击:6.10 创建密码字典
  14. Mysql从入门到入魔——8. 视图、存储过程、事务处理
  15. 装完黑苹果怎么装windows_苹果都说双系统好 黑苹果装windows教程
  16. 量化择业 银行vs券商vs公募vs私募?(行内人深度分享)
  17. 地平线创始人兼CEO余凯:自动驾驶处理器——人工智能的珠穆朗玛
  18. canon老的一体机在win10上无法直接安装成功
  19. PAT练习 骨牌铺方格
  20. Python工程之设计模式总结

热门文章

  1. 转 十道海量数据处理面试题与十个方法大总结
  2. 关于时间格式的解析问题
  3. Servlet(二)GenericServlet
  4. 从技术到求职,强烈推荐一下这9个牛逼的公众号,技术人必备
  5. 学习数学到底有什么用?
  6. 合并果子(贪心+优先队列)
  7. [math][mathematica] archlinux 下 mathematica 的安装 (科学计算软件 mathematica/matlab/sagemath)...
  8. 团队作业:《构建之法》团队学习心得
  9. phpstudy 上怎么运行 thinkPHP ?
  10. Android之NDK开发(转)