private、protected、public、final 区别

public:权限是最大的,可以内部调用,实例调用等。

protected: 受保护类型,用于本类和继承此类的子类调用。

private: 私有类型,只有在本类中使用。

abstract:修饰抽象方法,没有方法体,由继承该类的子类来实现。 entends

interface 定义接口 使用 implements

final:PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。(因此final和abstract不能同时出现)

trait 是什么东西
Trait为不支持多继承的php实现了多继承,使用时不是用extends继承,而是在类内部用 use 类名 表示。

  1. trait ezcReflectionReturnInfo {
  2. function getReturnType() { /*1*/ }
  3. function getReturnDescription() { /*2*/ }
  4. }
  5. class ezcReflectionMethod extends ReflectionMethod {
  6. use ezcReflectionReturnInfo;
  7. /* ... */
  8. }
  9. class ezcReflectionFunction extends ReflectionFunction {
  10. use ezcReflectionReturnInfo;
  11. /* ... */
  12. }

继承 单继承
public 、protected 、private都可继承 构造函数
备注 private 可继承,但不可调用 ,protected 在方法体内调用 parent:: 调用父类方法
如果构造函数不重写则调用父类

封装

多态
子类继承父类,属性方法进行拓展,但不能更改父类 (里氏替换原则)

SRP 单一责任原则
OCP 开放封闭原则
LSP 里氏替换原则
ISP 接口隔离原则
DIP 依赖倒置原则

什么是依赖注入
依赖注入是控制反转的一种实现,实现代码解耦,便于单元测试。因为它并不需要了解自身所依赖的类,而只需要知道所依赖的类实现了自身所需要的方法就可以了。

控制反转 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection, DI), 还有一种叫”依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

反射

设计模式
单例模式

  1. /**
  2. * 单例模式
  3. * 保证一个类仅有一个实例;单例类必须自己创建自己的唯一实例;
  4. * 单例类的构造函数定义为 private 私有方法;
  5. * 单例类必须自行向整个系统提供这个实例
  6. */
  7. class Singleton{
  8. private static $instance;
  9. //私有构造方法,禁止使用new创建对象
  10. private function __construct(){}
  11. //将克隆方法设为私有,禁止克隆对象
  12. private function __clone(){}
  13. //实例化化对象
  14. public function getInstance(){
  15. if ( !self::$instance instanceof self){
  16. self::$instance = new self;
  17. }
  18. //两种判断
  19. //if (!isset(self::$instance)) {
  20. //判断是否实例化
  21. //self::$instance = new self;
  22. //}
  23. return self::$instance;
  24. }
  25. public function test(){
  26. return "这是单例模式";
  27. }
  28. }
  29. $Singleton = Singleton::getInstance();
  30. $Singleton->test(); //这是单例模式
  31. $test = new Singleton(); //报错 Fatal error: Uncaught Error: Call to private Test::__construct() from invalid context in