💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
类中的七种语法说明 -属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数 一些基本概念: **类**− 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作 **对象**− 是类的实例 类创建后,我们可以使用**new**运算符来实例化该类的对像 ``` 两种写法 $test=new \Test(); 等同于 $test=new \Test; ``` 类的变量使用**var**来声明 var $tyy 一.## 访问控制 PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。 * **public(公有):**公有的类成员可以在任何地方被访问。 * **protected(受保护):**受保护的类成员则可以被其自身以及其子类和父类访问。 * **private(私有):**私有的类成员则只能被其定义所在的类访问。 注意:类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有 注意:类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。例如: ``` function test(){ echo 11; } 这是public的 ``` 注意:父类的protected方法只能在子类中被调用,不能通过实例化子类去执行父类protected方法 二. 常量 可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。 常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。 ~~~ <?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . PHP_EOL; } } echo MyClass::constant . PHP_EOL; ~~~ 三.类的继承与创建 1.基类与派生类叫法:基类就是父类,派生类就是子类 2.PHP 使用关键字**extends**来继承一个类,PHP 不支持多继承 3.如果父类中有一个无参的构造函数,那么子类就隐式调用父类默认的无 参的构造函数base():, 否则显示调用父类有参的构造函数base(参数 名)。 4.子类默认继承父类所有的 public 和 protected 方法,但不继承 private 方法和属性 5.继承的特性 传递性:子类可以调用父类以及父类以上所有父类的属性和方法 单根性:一个子类不能同时继承2个或2个以上的父类 注意: 子类继承父类的属性和方法,也就是说子类拥有父类所有的东西,包括 public(公有)、protected(保护)和private(私有)的。但是父类私有的属性和方法不能让子类直接调用,并不是说没有继承过来,而是继承过来了,但是要调用父类的私有属性和方法的话还是需要通过父类的 public、protected 方法调用 四.## 抽象类 (1)抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类 (2)定义为抽象的类不能被实例化。 (3)被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 (4)继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。 (5)如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化 ~~~ <?php abstract class AbstractClass { // 强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . PHP_EOL; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') . PHP_EOL; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') . PHP_EOL; ?> ~~~ 五.parent 关键字 parent 关键字可以在任何复写父类方法的方法中使用,通过在当前对象中调用父类的方法来拓展父类的功能 ,可以调用父类静态属性和静态方法和构造函数及一般方法 parent只能调用父类的public与protected方法及静态成员,调用private私有的方法会报错,调用非静态属性会报错 parent:: __construct()表示调用父类构造方法 六.## Static 关键字 声明类属性或方法为 static(静态),就可以不实例化类而直接访问。 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。 由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。 静态属性不可以由对象通过 -> 操作符来访问。 重点总结: 对象可以调用属性和静态属性,类只能调用静态属性。 对象可以调用方法和静态方法,类可以调用方法和静态方法。 ``` // 实例化类对象   $object = new Student('Tom');   // 对象调用属性   echo $object->stu\_name   // 对象调用静态属性   echo $object::$stu\_num   // 类调用静态属性   echo Student::$stu\_num,'   // 使用对象分别调用方法和静态方法   $object->stuFunction();   $object->static\_stuFunction();   $object::stuFunction();   $object::static\_stuFunction();   // 使用类分别调用方法和静态方法   Student::stuFunction();   Student::static\_stuFunction();   // 类调用类常量   echo Student::STUDENT ``` 七.## 构造函数和## 析构函数 构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与new运算符一起使用。 ~~~ function __construct( $par1, $par2 ) { $this->url = $par1; $this->title = $par2; } ~~~ 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。 ~~~ function __destruct() { print "销毁 " . $this->name . "\n"; } ~~~ 注意: 只有当类被实例化的时候才会执行构造函数与析构函数,类的成员被静态调用时不会被执行 ``` class Car{ public static $a=45; public function __destruct(){ self::$a=55; } public static function pay(){ return self::$a; } } echo \Car::$a; echo (new \Car)::$a; 分别是45,55 ``` 八.## Final 关键字 如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承