php类与对象听不明白,php 类与对象全面了解

类中的七种语法说明 -属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数

一些基本概念:

**类**− 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作

**对象**− 是类的实例

类创建后,我们可以使用**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,则不能被继承

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值