PHP类与对象

本文是复习所写,并不会涵盖一些基础知识点

 

基本概念

  1. 使用class关键字来定义类,使用new来创建类的实例

     <?php
     class Test
     {
         public $attr = 1; // 公共属性
         
         public function foo()
         {
             echo $this->attr;
         }
     }
     ​
     // 方式一
     $obj = new Test();
     $obj->foo();
     ​
     // 方式二
     // 与可变函数类似,称为可变类吧
     $className = 'Test';
     $obj = new $className();
     $obj->foo();
     ​
     // 方式三 PHP8
     function getClassName()
     {
         return 'Test';
     }
     $obj = new (getClassName());
     $obj = new (Test::class);

    在类内部可以使用new selfnew parent创建新对象

    将对象实例赋值给一个新变量时,新变量访问的是同一实例。要创建一个新实例必须使用克隆操作

  2. 类的属性和方法存在与不同的空间,所以同一个类的属性和方法可以使用同样的名称

  3. 使用extends实现类继承,PHP只支持单继承。

  4. ::class类名解析

     <?php
     namespace Demo
     {
         class Test()
         {
             
         }
         
         // 方式一
         echo Test::class;
     }
     ​
     // 方式二 PHP8
     $obj = new Test();
     echo $obj::class; // 等同于 get_class()
  5. Nullsafe方法和属性 PHP 8

    ?->nullsafe操作符,对象引用解析为null时不抛出异常,而是返回null

属性

 <?php
 class Test
 {
     // 访问控制符
     public $attr = 1;
     protected $attr1 = 2;
     private $attr2 = 3;
     
     // 静态
     public static $attr3 = 4;
     
     // 类型声明 PHP7.4
     public int $attr4 = 4;
     
     // 只读 PHP8
     public readonly $attr5 = 5;
 }

类常量

 <?php
 class A {
     const ATTR_1 = 1;
     
     // 使用访问修饰符 PHP7.1
     public const ATTR_2 = 2;
     protected const ATTR_3 = 3;
     private const ATTR_4 = 4;
     
     // final常量 PHP8.1
     final const ATTR_5 = 5;
 }
 ​
 class B extends A
 {
     const ATTR_1 = 6; // 可以在子类中重定义
 }

类的自动加载

推荐使用spl_autolad_register()来注册自动加载器,可以注册任意多个

__autolad()的方式已经废弃,并在PHP8中移除

构造函数和析构函数

  1. 构造器属性提升 PHP 8

    当构造器参数带有访问控制时,PHP会同时将它们当作对象属性和构造器参数,并赋值到属性

范围解析操作符::

抽象类

任何一个类,如果它里面至少有一个方法是抽象的,那么这个类就必须被声明抽象的

抽象类也可以实现接口

接口

接口也可以使用extends来扩展

也可以定义常量,PHP8.1之前不能被子类或子接口覆盖

Trait

  1. 优先级:当前类>Trait>父类

  2. 冲突解决

    insteadof用于排除另一个trait中同名方法

    as将trait中方法重命名,也可以用于修改方法的访问修饰符

  3. trait中也可以使用其它trait

  4. trait中可以定义属性、方法、抽象方法、静态方法、静态属性

匿名类

重载

PHP中的重载是指在访问未定义的属性、方法时,会调用特定的魔术方法

属性重载:

  • __set()

  • __get()

  • __isset()

  • __unset()

方法重载:

  • __call()

  • __callStatic()

遍历对象

对象的可见属性都将被遍历

魔术方法

后期静态绑定

self::代表的是当前方法所在的类的实例

static::限定调用的方法未指定类中的方法

 <?php
 class A {
     public static function who() {
         echo __CLASS__;
     }
     public static function test() {
         static::who(); // 后期静态绑定从这里开始
     }
 }
 ​
 class B extends A {
     public static function who() {
         echo __CLASS__;
     }
 }
 ​
 B::test(); // Output: B

协变与逆变

协变使子类比父类方法能返回更具体的类型

逆变使子类比父类方法参数类型能接受更模糊的类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值