Codecasts之面向对象编程

1、类的基础定义和概念

对象是类的实例化

对象之间可以传递,接收并处理信息。

类拥有属性和方法 ,访问控制 public protect private

特殊方法之构造方法   __construct($parameter1,$parameter2,...),在实例化的时候 new Task($a,$b,...)

类的内部访问属性或者方法的时候,使用$this,它代表该类的实例

注意事项:

  • 类的命名首字母大写并且于文件名一致

2、Setter和Getter的使用

在类的内部定义两个public方法,来实现一些访问控制,或者读取、设置一些特殊的属性

3、理解封装用法和目的

封装:尽可能的隐蔽一些信息,不需要用户直到内部放生了什么,只需要知道可以有哪些操作就可以了。比如灯泡开关的问题,只知道开关就可以了,不需要知道线路什么的。具体实现关键字 private、protected。

protected主要用于继承。在外部不可以被调用。

private私有属性或者方法,不可以被外部访问,不可以被继承。

4、类的继承和应用场景

class A extends B {}

子类可以直接使用继承的属性和方法,实现代码的复用

子类重写父类的方法时,重新定义方法名即可

注意事项:

  1. 子类继承的方法控制不能低于父类的访问控制

5、理解抽象类

abstract class Shap {
   public $color;
   public function __construct($color){
          $this->color = $color;
   }
   abstruct public function squire();
}

抽象类是用于继承的,不能被实例化

抽象类如果有抽象方法的时候,子类必须实现抽象方法

这样做可以保持类的一致性。

注意事项:

  • 抽象类中的抽象方法不用带大括号,即不用带函数体。

6、interface接口的理解

接口类似于契约,条款,劳动合同等。比如短信接入,支付通道接入,日志记录方式(文件记录,DB记录)等。这样做是为了方便切换,而不需要大幅度的修改代码。

interface Logger{
  public function save();
}

class FileLogger implements Logger{
   public function save(){
      return 'save log by file';
   }
}

class DatebaseLogger implements Logger{
    public function save(){
        return 'save log by datebase';
    }
}

class UserController {
    producted $logger;
    public function __construct(FileLogger $logger){
      $this->logger = $logger;
    }
    
    public function register(){
       $name = 'Tom';
       $this->logger->save();
    }
}

$controller = new UserController( new FileLogger );
$controller->register();

注意事项:

  • 接口关键字 interface ,用于一种契约
  • 继承接口的子类才可以被实例化,calss A implement B { }
  • 子类必须实现接口中的抽象方法
  • 依赖注入的方式是类的属性代表某一个类的实例,通过构造函数的参数类型限制来实现

7、PHP命名空间与自动加载

PSR-4标准 namespace命名空间的出现是为了解决多个文件代码的冲突,类似于一个文件夹下文件名不能一样。

命名空间类似与文件夹系统,laravel中使用PSR-4标准 namespace 该文件所在的文件夹目录,相对于App。

项目当中最佳实践:一个类一个文件

自动加载使用composer工具,这个点的知识需要候补。composer自动加载。

注释:

  • 在一个文件当中如果需要引用别的类时,可以使用use关键字。
  • 另外一种方法就是在new的时候,带上命名空间。但一般使用上面的方法。

8、静态属性和静态方法

静态方法和静态属性只与类有关,与实例化的对象无关。

static 定义的属性和方法是全局性的,相当于global。

在类的外部使用的时候,格式例如: ClassName::staticOption/staticMethod

在类的内部使用的时候,格式例如: self::staticOption/staticMethod

额外辅助:

  • array_sum()数组元素求和,func_get_args()获取函数的参数。
  • function add(...$num){
      return array_sum($num);
    }
    function add(){
      return array_sum(func_get_args());
    } 候补参数中...写法

9、const关键字的理解和应用

class HttpStatusCode{
  const HTTP_NOT_FOUND = 404;
  public function getStatusCode(){
     return self::HTTP_NOT_FOUND;
  }
}

echo HttpStatusCode::HTTP_NOT_FOUND;
$obj = new HttpStatusCode();
echo $obj->getStatusCode();

一但使用关键字const定义了常量,不管是在类的外部或者类的内部,是无法改变它的值的。除非手动修改值。

应用场景一般是固定值,一旦确定就不可改变的,比如状态码。。。

10、关键字Trait的使用

应用场景:

  • 代码重用
  • 向别人的代码加入自己的代码
trait OwnerTrait(){
   public function owner(){
     echo 'owner';
   }
}

class Arcital(){
   use OwnerTrait;
}

class Comment(){
   use OwnerTrait;
}

(new Comment())->owner();

注意事项:

  • 实战小技巧,使用trait的时候,名字最后带上trait,识别度更高。
  • trait的定义以及使用方法。





你可能感兴趣的:(后端工程师之路)