1.什么是OOP
面向对象:Object Oriented Programming,是一种软件开发/设计方法。基于对象而不是函数和过程;面向对象是相对于面向过程来讲的。面向对象方法把相关的一些数据和方法组织成一个整体进行看待,它从更高的层次来进行了一个系统建模,所以更贴近我们事物的自然运行模式,像我们的Java c++都是面向对象的编程语言。
使用面向对象来构建我们的应用程序数据结构更具有条理性,数据结构成为了一个包含属性和方法的对象;PHP可以是面向过程也可以是面向对象。面向对象和面向过程在许多编程语言中,只能二者选其一来进行编程,但是PHP语言和其他编程语言有不同之处,我们可以自由选择或者将PHP面向过程和PHP面向对象两者进行混用。
2. 为什么使用OOP
- 代码整洁并且更容易管理
- 模块化结构
- 更利于团队协同
- 可重用性,灵活性,扩展性
- 易于维护
3. 对象和类
- 类是抽象的,对象是具体的
- 类是一系列拥有相同属性和方法的对象抽象出来的集合
- 一个类可以对应多个对象
4.创建类和实例化对象
1)PHP 定义类
- 使用 class 关键字后加上类名定义
- 类名后的一对大括号{},{}内可以定义变量和方法
- 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
<?php
//定义类
class User {
//设置属性(成员变量)
public $name = 'Summer';
public $age = 25;
//设置函数(成员函数)
public function sayHello() {
echo "Says Hello!";
}
}
?>
2)实例化对象:类创建后,我们可以使用 new 运算符来实例化该类的对象
<?php
//定义类
class User {
//设置属性(成员变量)
public $name = 'Summer';
public $age = 25;
//设置函数(成员函数)
public function sayHello() {
echo "Says Hello!";
}
}
//实例化对象
$user1 = new User();
?>
3)访问成员方法与成员变量
<?php
//定义类
class User {
//设置属性(成员变量)
public $name = 'Summer';
public $age = 25;
//设置函数(成员函数)
public function sayHello() {
echo "Says Hello!";
}
}
//实例化对象
$user1 = new User();
//访问成员变量与成员方法
echo $user1->name;
echo $user1->age;
$user1->sayHello()
?>
4)传参
<?php
//定义类
class User {
//设置属性(成员变量)
public $name = 'Lucy';
public $age;
//设置函数(成员函数)
public function sayHello($name) {
echo $this->name . '<br>';
echo $name . " Says Hello!";
}
}
//实例化对象
$user1 = new User();
//访问成员变量与成员方法
echo $user1->sayHello('Summer');
?>
变量 $this 代表自身的对象。

5.构造函数/析构函数
1)构造函数是一种在实例化对象时可以自动运行的方法。具有构造函数的类,会在每次创建新对象的时候先调用这个方法。(主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用)
创建构造函数:
<?php
//创建类
class User {
//设置属性
public $name;
public $age;
//构造函数 创建对象时自动调用
//适合在使用对象之前做一些初始化的工作
public function __construct() {
echo '构造函数已运行...';
}
//设置函数
public function sayHello() {
return $this->name . "Says Hello!";
}
}
//实例化对象
$user1 = new User();
?>

传参:
<?php
//创建类
class User {
//设置属性
public $name;
public $age;
//构造函数 创建对象时自动调用
//适合在使用对象之前做一些初始化的工作
public function __construct($name, $age) {
// echo '构造函数已运行...';
$this->name = $name;
$this->age = $age;
}
//设置函数
public function sayHello() {
return $this->name . "Says Hello!";
}
}
//实例化对象
$user1 = new User('Summer', 25);
//访问类的属性
echo $user1->name;
echo $user1->age;
echo '<br>';
//实例化对象
$user2 = new User('Sara', 35);
//访问类的属性
echo $user2->name;
echo $user2->age;
?>
2)析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
析构函数在某个对象的所有引用都被删除或者当对象被显式销毁时执行:
- 明确的使用unset函数销毁一个变量
- 脚本运行结束之后,也会自动销毁
- 改变对象变量的值,也会自动销毁
创建析构函数:
<?php
//创建类
class User {
//设置属性
public $name;
public $age;
//构造函数 创建对象时自动调用
//适合在使用对象之前做一些初始化的工作
public function __construct($name, $age) {
// echo '构造函数已运行...';
$this->name = $name;
$this->age = $age;
}
//设置函数
public function sayHello() {
return $this->name . "Says Hello!";
}
//析构函数
public function __destruct() {
echo '析构函数已经运行...';
}
}
//实例化对象
$user1 = new User('Summer', 25);
//访问类的属性
echo $user1->name;
echo $user1->age;
echo '<br>';
//实例化对象
$user2 = new User('Sara', 35);
//访问类的属性
echo $user2->name;
echo $user2->age;
?>

3)魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。
<?php
//创建类
class User {
//设置属性
public $name;
public $age;
//构造函数 创建对象时自动调用
//适合在使用对象之前做一些初始化的工作
public function __construct($name, $age) {
//魔术常量 __CLASS__
echo '类' . __CLASS__ . '实例化了<br>';
// echo '构造函数已运行...';
$this->name = $name;
$this->age = $age;
}
//设置函数
public function sayHello() {
return $this->name . "Says Hello!";
}
//析构函数
public function __destruct() {
echo '析构函数已经运行...';
}
}
...
...
?>
__construct,__destruct也叫魔术方法。
6.访问修饰符
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
注:类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
属性的访问控制:
<?php
class User {
//访问控制符
public $name = 'Summer';
protected $idcard = '620xxxxxx';
private $age = 25;
public function sayHello() {
echo $this->name;
echo $this->idcard;
echo $this->age;
}
}
class Person extends User {
//可以对 public 和 protected 进行重定义,但 private 而不能
protected $idcard = '621xxxxxx';
public function printHello() {
echo $this->name;
echo $this->idcard;
// echo $this->age; //报错
}
}
$user1 = new User();
$user1->sayHello(); //Summer 620xxxxxx 25
echo $user1->name; //Summer
// echo $user1->idcard; //报错
// echo $user1->age;//报错
$user2 = new Person();
$user2->printHello(); //Summer 621xxxxxx
echo $user2->name; //Summer
?>
方法的访问控制:
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
7.继承
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承。继承不改变类的结构,只表明两个类之间存在一些关联。
<?php
class User1 {
protected $name = "Summer";
protected $age = 25;
}
//继承
class Customer extends User1 {
public function pay($amount) {
return $this->name . '支付了' . $amount;
}
}
$customer1 = new Customer();
echo $customer1->pay(100);
?>
传参:
<?php
class User1 {
protected $name;
protected $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
//继承
class Customer extends User1 {
public function pay($amount) {
return $this->name . '支付了' . $amount;
}
}
$customer1 = new Customer('John', 30);
echo $customer1->pay(100);
?>
添加扩展属性和方法:
<?php
class User1 {
protected $name;
protected $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
//继承
class Customer extends User1 {
private $balance;
public function __construct($name, $age, $balance) {
parent::__construct($name, $age);
$this->balance = $balance;
}
public function pay($amount) {
return $this->name . '支付了' . $amount;
}
public function getBalance() {
return $this->balance;
}
}
$customer1 = new Customer('John', 30, 200);
// echo $customer1->pay(100);
echo $customer1->getBalance();
?>
8.静态属性和方法
静态属性和方法:通过 static 关键字修饰的成员属性和成员方法。static关键字的内容被称为静态成员。类中的静态成员和一般成员是不一样的,静态成员不会被实例化到对象当中,声明类属性或方法为 static,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用(可以用self)。静态属性不可以由对象通过 -> 操作符来访问。对静态变量的操作会对所有对象都起作用。
<?php
class User2 {
public $name;
public $age;
//静态属性
public static $minPassLength = 6;
public static function validatePass($pass) {
//strlen()验证字符串长度
if(strlen($pass) >= self::$minPassLength) {
return true;
}else {
return false;
}
}
}
//访问
$password = 'hello';
if(User2::validatePass($password)) {
echo '密码验证通过';
}else {
echo '密码验证不通过';
}
?>
9.常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
<?php
class Person {
//类常量
const IP = '127.0.0.1';
public function printIP() {
echo self::IP;
}
}
$person = new Person();
$person->printIP();
?>