PHP面向对象1

概念

1、 OOP:Object Oriented Programming 面向对象编程
2、 OOA:Object-Oriented Analysis 面向对象分析
3、 OOD:Object-Oriented Design 面向对象设计
4、 对象只能有属性、方法、和常量

类-数据类型
对象-复杂的变量
属性-变量
function-方法、函数

类名不区分大小写

通过new关键字类实例化对象,实例化的过程就是分配内存的过程
$stu = new Student();//实例化对象就是把对象的地址传递给$stu1变量

封装

a) public:公有的 可以在类的内部和外部访问
b) protected:受保护的 在整个继承链上访问
c) private:私有的 只能在类的内部访问

属性一般是私有的,通过公有的方法对私有的属性进行赋值和取值。这样做为了保证数据完整性
$this在类的内部使用,表示调用当前方法的对象

类、对象、属性、方法在内存中的表现

内存区域
静态区和常量区
代码区 <===> 类
堆区 <===> 对象
栈区 <===> 对象的变量,变量指向的是对象的地址

调用属性直接调用对象中的对应属性即可。
调用方法先获取对象所在的类,然后调用类中的方法。

类的本质是一个复杂的数据类型;对象的本质是内存中的空间,是一个复杂的变量

构造函数

__construct()
构造函数:在对象产生的时候自动调用
a) 可以传递不同的参数
b) 用来初始化成员变量(属性)

跟类名同名的方法也是构造方法;PHP中推荐使用__construct()做构造函数,且优先级较高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
class Student {
//构造函数语法二
public function Student() {
echo 'i am a boy!<br>';
}
//构造函数语法一(优先级高)
public function __construct() {
echo 'i am a student<br>';
}
}
//测试
new Student; //i am a student
new Student; //i am a student
?>

析构函数

__destruct()
析构函数:在对象销毁的时候自动调用
a) 析构函数不能有参数

继承(extends)

语法:

1
2
3
Class 子类 extends 父类{
//类成员
}

私有的属性也是可以被继承的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class Person{
private $name = 'uiste';
public function show(){
echo "好学生就是:".$this->name;
}
}

class Student extends Person{

}

$stu1 = new Student();
$stu1->show();
?>
好学生就是:uiste

如果父类private私有属性重写的时候,无论子类属性是:public、protected、private都会生成性的属性;
如果父类是protected受把偶的属性时,子类不可以是private私有的。只能是protected、public,且属性会被重写;
如果父类是public公有的属性时,子类也只能是public公有的;

总之:父类属性不是私有状态,子类的属性就不能比父类属性的权限严格。
父类属性时私有状态是,子类的属性可以任何状态,重写则会被重新建立。

子类中调用父类的属性和方法

调用父类的属性和方法用$this关键字

调用父类的构造方法

通过parent和父类的类名来调用父类的构造函数
语法:
parent::__construct()
父类类名::__construct()

如果子类有构造函数就调用子类的构造函数,如果子类没有就调用父类的构造函数

1、 继承:extends关键字
2、 $this:当前对象的引用
3、 parent:父类的类名
4、 私有属性也是可以被继承的

给父类的构造函数传递参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php 
class Person{
private $name;
private $sex;
public function __construct($name,$sex){
$this->name = $name;
$this->sex = $sex;
}
}

class Student extends Person{
private $score;
public function __construct($name,$sex,$score){
parent::__construct($name,$sex);
$this->score = $score;
}
public function show(){
echo $this->name.'是'.$this->sex.'生,考了:'.$this->score.'分数';
}
}

$stu1 = new Student('小明','男',98);
$stu1->show();
?>
Notice: Undefined property: Student::$name in /Users/uiste/www/test.php on line 135
Notice: Undefined property: Student::$sex in /Users/uiste/www/test.php on line 135
是生,考了:98分数
父类是private私有的不能被继承下来;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class Person{
protected $name;
protected $sex;
public function __construct($name,$sex){
$this->name = $name;
$this->sex = $sex;
}
}

class Student extends Person{
private $score;
public function __construct($name,$sex,$score){
parent::__construct($name,$sex);
$this->score = $score;
}
public function show(){
echo $this->name.'是'.$this->sex.'生,考了:'.$this->score.'分数';
}
}

$stu1 = new Student('小明','男',98);
$stu1->show();
?>
小明是男生,考了:98分数

protected 修饰的成员在整个继承连上访问
$this 表示当前对象的引用(地址)

A类 B类
private 不可访问
protected 不可访问
public 可以访问

父类 子类