# 面向对象的概念(OOP)
1、出现软件危机(落后的软件生产力无法满足迅速增长的计算机软件需求) 2、出现软件工程学(分为结构化方法 和 面向对象) oop目标:重用性、灵活性、扩展性 oop特点:封装、继承、多态
认识面向对象 面向对象的三个特征: 1、对象的行为:方法 2、对象的状态:属性 3、对象的标识:重新具有新的属性,标识性的
# 如何抽象一个类
格式什么的看起来太烦,直接贴个代码
<?php
/**
* 类的声明
*/
class Person
{
public $age;
public function say($word)
{
echo "she say {$word}";
}
public function info()
{
$this->say('Hi');
return $this->age;
}
}
$xiaoming = new Person();
$xiaoming->age = 22;
$age = $xiaoming->info();
echo $age;
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 构造方法和析构方法
<?php
/**
* 构造方法和析构方法
*/
class Person
{
//构造方法当new时自动执行
public function __construct($event, $age)
{
$this->event = $event;
$this->age = $age;
}
public function data()
{
return $this->age;
}
public function __destruct()
{
//对象被销毁时执行,没有代码去运行了
//用途 可以进行资源的释放操作 数据库关闭
echo "{$this->event} 结束<br>";
}
}
$xiaomimg = new Person('测试1', 30);
$xiaomimg = new Person('测试2', 30);
echo $xiaomimg->data();
?>
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
29
30
# 面向对象封装性
设置私有成员与私有成员访问
- 魔术方法__set($key, $value) :设置元素的时候调用(只针对protected / private)
- 魔术方法__get($key) : 取这个元素的时候调用
- 魔术方法__isset($key) :判断元素是否设置时使用
- 魔术方法__unset($key) :从类里面释放的时候调用
封装的修饰符:
- public:(共有的 默认)
- private : (私有的)私有的成员方法,不能在类的外部直接访问
- protected : (受保护的)私有的成员方法,不能在类的外部直接访问
<?php
/**
* 面向对象之封装性
*/
//修饰符 public private protected
class Person
{
public $test_unset = '测试unset';
private $name = 'xiaoming';
private $age = 18;
protected $money = 10000;
//私有的成员方法,不能在类外部直接访问
private function getAge()
{
return $this->age;
}
//被保护的成员方法,不能在类外部直接访问
protected function getMoney()
{
return $this->money;
}
public function userCard()
{
echo "name:" . $this->name . "<br>" .
"age:" . $this->getAge() . "<br>" .
"money:" . $this->getMoney() . "<br>";
}
public function __set($key, $value)
{
// 魔术方法set只正对private、protected有效
if ($key == 'name' && $value == 'xiaohong') {
echo '我监听到了set方法';
}
}
public function __get($key)
{
if ($key == 'age') {
echo '<br>成功获取到年龄!';
}
}
public function __isset($key)
{
if ($key == 'age') {
echo '<br>age被设置!';
}
}
public function __unset($key)
{
echo $key;//无效 也是只对private protected有效
if ($key == 'test_unset') {
echo 'test_unset执行成功!';
}
}
}
$xiaoming = new Person();
//getAge() getMoney()都无法调用
$xiaoming->userCard();
//name 已经为private属性 如果不用set方法 下面这行会报错
$xiaoming->name = 'xiaohong';
//age 已经为private属性 如果不用get方法 下面这行会报错
$xiaoming->age;
isset($xiaoming->age);
//unset 干掉一个变量
unset($xiaoming->test_unset);
echo $xiaoming->test_unset;
?>
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 面向对象之继承和多态
在子类中允许重写(覆盖)父类的方法:(在重写跟父类同样的方法名会被覆盖) 重载:可以在子类中重写父类方法的时候,使用parent::方法名,这样就可以访问到父类的方法了
使用parent访问父类中被覆盖的属性和方法 parent::construct(); parent::fun();
class Person
{
public $name;
private $age;//私有的 继承不过来了
protected $money;//外部不能访问 但是可以被继承过去
public function __construct($name, $age, $money)
{
$this->name = $name;
$this->age = $age;
$this->money = $money;
}
public function cardInfo($pp)
{
echo "name:" . $this->name . "<br>" .
"age:" . $this->age . "<br>" .
"money:" . $this->money . "<br>";
}
}
class Yellow extends Person
{
public function __construct($name, $age, $money)
{
parent::__construct($name, $age, $money);
}
public function cardInfo($pp)
{
parent::cardInfo($pp); // TODO: Change the autogenerated stub
echo $pp;
}
//protected 外部不能访问 但是可以继承
public function show() {
echo $this->money;
}
}
$test = new Yellow('xiaoming', 18, 10000);
$test->cardInfo(11);
$test->show();//10000
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 抽象类
1、含有抽象方法的类必须是抽象类 2、抽象类不一定非得含有抽象方法 3、抽象类可以存在普通的方法 4、抽象类不能被实例化 必须由一个子类去继承 并且把抽象类的抽象方法都实现了
abstract class Person
{
public abstract function eat();
}
class Man extends Person
{
public function eat()
{
echo '抽象类不能被实例化 必须由一个子类去继承 并且把抽象类的抽象方法都实现了';
}
}
$man = new Man();
$man->eat();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 接口
1、接口声明的关键字是interface 2、接口可以声明常量也可以抽象方法 3、接口中的方法都是抽象方法 不用手动的abstract的去定义 4、接口不能被实例化 需要一个类去实现它 5、一个类不能继承多个类,但是一个类可以实现多个接口
interface Person
{
//首先常量不能被修改,其次属于静态方法
const NAME = 'xiaowang';
public function run();
public function eat();
}
interface study
{
public function study();
}
class Student implements Person, study
{
const myBelong = '<br>' . '这是一个属于自己的变量';
public function run()
{
echo 'run';
}
public function eat()
{
echo 'eat';
}
public function study()
{
echo 'study';
}
public function test()
{
return self::myBelong;
}
public static function show()
{
return '<br>' . '这是一个属于自己的静态方法';
}
}
$xiaomimng = new Student();
$xiaomimng->eat();//eat
echo "<br>" . $xiaomimng::NAME;//xianming
echo $xiaomimng->test();//这是一个属于自己的变量
echo Student::myBelong;//这是一个属于自己的变量
echo Student::show();//这是一个属于自己的静态方法
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 关键字
final:只能用来修饰类和方法,不能修饰成员属性 特性: 使用final关键字标识的类不能被继承 使用funal关键字标识的方法不能被子类覆盖(重新),是最终版本 目的: 1.安全,2.没必要继承或重新
static:用于修饰类的成员属性和成员方法(即静态属性和静态方法) 类中的静态属性和方法不用实例化(new)就可以直接使用类名访问 格式: 类::$静态属性 类::$静态方法 在类的方法中,不能用this->来引用变量或静态方法,而需要用self来引用 self::$静态属性 self::$静态方法 静态方法中不可以使用非静态的内容,就是不让用$this 静态属性是共享的,也就是new很多对象也是公用一个属性
单例设计模式:一个类只能有一个实例对象存在 静态属性是共享的,也就是new很多对象也是公用一个属性
instanceof :用于检测当前对象实例是否属于某一个类或这个类的子类
PHP面向对象程序设计之魔术方法: 科隆对象 $p1 = clone $p2(克隆出来互不干扰) 类中通用的方法__toString() __call()方法的应用 自动加载类:(php5) php中当new实例化一个不存在的类时,则自动调用此函数__autoload(),并将类名作为参数传入此函数。可 以使用这个实现类的自动加载。 对象串行化(序列化) class_exists:检查类是否已定义 get_class_methods:返回由类的方法名组成的数组 get_class:返回对象的类名 get_object_vars:返回由对象属性组成的关联数组 get_parent_class:返回对象或类的父类名 is_a:如果对象属于该类或该类是此对象的父类,则返回TRUE method_exits:检查类的方法是否存在 property_exists:检查对象或类是否具有该属性
# 异常处理
系统自带的异常处理 try{ ... } catch(Exception $e) { // Exception错误类 echo "错误的文件:"; echo $e -> getFile(); // 得到发生异常的文件 echo "错误的行:"; echo $e -> getLine(); // 得到发生异常的行 echo "错误的代码:"; echo $e -> getCode(); // 得到发生异常的代码 echo "错误信息:"; echo $e -> getMessage(); // 异常信息 } 自定义异常处理 class myException extends Exception { // 继承错误类 ... } 捕捉多个异常处理