类中的七种语法说明 -属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数
一些基本概念:
**类**− 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作
**对象**− 是类的实例
类创建后,我们可以使用**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方法
二. 常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
~~~
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 关键字,并且不能被实例化
~~~
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,则不能被继承