乐趣区

关于php: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

协变与逆变

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

逆变使子类比父类办法参数类型能承受更含糊的类型。

退出移动版