PHP面向对象01:面向对象基础
- 一、关键字说明
- 二、技术实现
- 1. 定义类
- 2. 类成员
- 三、 访问修饰限定符
- 1. public
- 2. protected
- 3. private
- 4. 空修饰限定符
- 四、类内部对象
- 五、构造和析构
- 1. 构造方法
- 2. 析构方法
- 六、范围解析操作符
- 1. 访问类常量
- 2. 静态成员
- 3. self关键字
- 七、类的加载
- 1. 手动加载
- 2. 自动加载
- 八、对象克隆
一、关键字说明
- class:类。
- object:对象,也称实例。
- new:实例化。
- member:类成员。
- method:方法,也称成员方法。
- property:属性,也称成员变量。
- constant:类常量。
二、技术实现
1. 定义类
- 定义类基本语法:
class 类名 {}
<?php
# 定义类
class Nothing {}
# 实例化对象
$nothing = new Nothing;
var_dump($nothing);
数据类型为对象,对象属于Nothing类,编号为1,当前对象里面有0个属性。
2. 类成员
- 指直接定义在类结构内部的以及成员,即直接依赖{}的成员。
- 分为三种:成员变量、成员方法、类常量。
-
成员变量:
- 需要在变量名字前使用关键字 public。
- 语法:
public 变量名 [=值];
class Nothing { public $a; public $b = 1; }
- 访问方式:
$对象名->属性名;
# 实例化对象 $nothing = new Nothing; # 增 $nothing->c = 20; # 删 unset($nothing->a); # 改 $nothing->b = -1; # 查 echo $nothing->b;
-
成员方法:
- 在类结构{}下定义的函数。
class Salar { public function display() { echo __CLASS__; } }
- 成员方法访问:
$对象名->方法名();
$s = new Salar(); $s->display();
-
类常量:
- 定义方式:
const 常量名 = 值;
class Saler { const PI = 3.14; }
- 类常量不能由对象来进行访问。
- 定义方式:
三、 访问修饰限定符
- 用来控制属性或方法的访问位置。
- 分为三种:public、protected、private。
- 多使用private,少使用public。
1. public
- 表示公有,所修饰的内容可以在任何地方都可访问。
2. protected
- 受保护,只能在当前类和相关类的内部访问。
3. private
- 私有,只能在当前类的内部访问。
4. 空修饰限定符
- 只有方法可以省略修饰限定符,默认为public。
- 不建议省略。
四、类内部对象
- $this是内置对象,代表的是对象。
- $this不受修饰限定符影响。
五、构造和析构
1. 构造方法
- 构造方法:
__construct()
,是一种类结构特有的特殊方法,实例化对象时,对象自动调用。
class Person{
public function __construct() {
echo __CLASS__;
}
}
- 初始化属性
2. 析构方法
- 析构方法
__destruct
在对象被销毁时会自动调用。 - 使用析构方法的情况:
- 保存对象的变量被用来保存其他数据,导致对象内存没有任何变量引用。
- 删除对象变量。
- 脚本执行结束,释放所有变量。
<?php
class Saler{
public function __destruct(){
echo __FUNCTION__;
}
}
$saler = new Saler();
unset($saler);
六、范围解析操作符
- 由两个冒号组成
::
,可以实现类直接访问类成员。格式:类名::类成员
- 如果需要有一些自身的数据和操作(类常量、静态成员),由类来访问。属性和方法由对象访问。
1. 访问类常量
class Saler {
const PI = 3.14;
}
echo Saler::PI;
2. 静态成员
- 静态成员,是由static关键字修饰的类成员,表示该成员属于类访问。
- 不建议使用对象访问带 static 的静态成员。
- 多用静态,少用非静态。
- 静态属性:
<?php class Person{ public $money = 0; public static $count = 0; } $person = new Person(); // 访问成员属性 echo $person->money; echo "<br>"; // 访问静态属性 echo Person::$count;
- 静态方法:
<?php class Person{ public static $count = 0; public static function showCount() { echo Person::$count, __FUNCTION__; } } Person::showCount();
3. self关键字
- 静态成员中不能使用
$this
,只能使用self
self
关键字在类的内部使用,用于代替类名。
<?php
class Person{
private static $count = 0;
public static function showClass() {
echo Person::$count;
echo self::$count; // self代替类名
}
}
Person::showClass();
- 当构造方法被私有化,就没法在类外部实例化对象,此时可以在类内部进行对象实例化。
<?php
class Person{
private function __construct() { }
public static function getInstance() {
return new self();
}
}
$person = Person::getInstance();
七、类的加载
1. 手动加载
- 即要访问某个类之前,使用文件包含将类所在的文件加载进来
- 加载类文件比较消耗资源,所以事先用
class_exists()
来判断是否存在。
<?php
if (!class_exists("Saler")) {
include_once "Saler.php";
}
$saler = new Saler();
2. 自动加载
- 自动加载是PHP提供的一种加载机制。
- php7以前:实现定义一个函数
__autoload()
,然后当系统需要实用类,而内存中不存在的时候,系统会自动调用__autoload()
来加载类文件。 - php7以后:自动加载通过
spl_autoload_register()
实现<?php class Autoload{ function c_autoload($class) { $c_file = 'c/' . $class . '.php'; if (file_exists($c_file)) require_once $c_file; } function d_autoload($class) { $c_file = 'd/' . $class . '.php'; if (file_exists($c_file)) require_once $c_file; } } spl_autoload_register(array("Autoload", "c_autoload")); spl_autoload_register(array("Autoload", "d_autoload")); $saler = new Saler();
八、对象克隆
clone
可以克隆对象,通过已有的对象复制一个新的同样的对象,两个对象不是同一个内存地址。
<?php
class Son{
public $name;
private $money = 0;
}
$son = new Son();
$son_clone = clone $son;
- 在对象被克隆时,新对象会自动调用
__clone()
方法。
class Son{
public $name;
private $money = 0;
public function __clone() {
var_dump($this);
}
}
- 如果不允许在外部克隆对象,将
__clone()
私有化。