类与对象
1 概念
序号 |
名称 |
描述 |
关键字 |
1 |
类class |
对象的模板 |
class |
2 |
对象instance |
类的实例 |
new |
- 类与对象界限并不清晰,在不影响理解前提下,常用类代表实例来引用类成员
- 对象与类的某一个实例绑定, 所以对象与实例可视为同义词,互换并不影响
# 对象也是实现代码复用的手段
# 要使用对象,就必须创建一个类,根据这个类,不断创建多个对象出来,实现代码复用
#类的声明与实例化
// 声明类
class Goods{
}
#类的实例化,是一个创建对象的过程。new
$goods = new Goods();
# 再不会引起误会的情况下,示例与对象是同义词
// 判断对象$goods是不是类Goods的示例
var_dump($goods instanceof Goods);
// 输出 bool(true)
// 查看 对象$goos 的类名
echo get_class($goods);
// 输出 Goods
// 类名是支持使用变量的,动态类
$class = 'Goods';
$obj = new $class();
echo get_class($obj);
// 输出 Goods
// 用函数将首字母转为大写 动态生成类名经常用
$class = *First('goods');
echo $class;
// 输出 Goods
2 类中成员
2.1 按功能分类
序号 |
名称 |
描述 |
关键字 |
1 |
类属性property |
类中变量 |
无 |
2 |
类方法method |
类中函数 |
function |
3 |
类常量method |
类中常量 |
const |
. |
<?php
# 类成员:类属性,类方法,类常量
// 类名必须首字母大写
class User
{
// 类中变量必须要有作用域:或者叫访问限制
// 语法 : 访问限制符 $ 变量名 = 值
// 常规属性 跟静态属性相比又叫动态属性
// public 公开的
// 字符串
public $name = 'micheal';
// 数字
public $age = 15;
// 数组
public $arr = [1,2,3,4];
// nowdoc heredoc
public $txt = <<< TXT
<h2>我爱你中国</h2>
TXT;
####但是####
// 以下属性不可以用 :非法属性值
// 不能用变量
// public $age = $varl;、
// 不能用类属性 类方法 赋值
// public $age = $this->age;
// 不能用表达式
// public $age = $age*10;
// 不能使用函数调用的结果
// public $age = age();
// 2.静态属性
// 如果一个属性的值对所有示例来说是一样的,换句话说就是他被所有的对象所共享 那么就没有必要用对象来访问
// 用类访问,此时可以声明为静态的
public static $username = '双倍快乐';
// php 程序运行简单分为两个阶段:编译,执行
// 静态属性在程序的编译阶段就完成了初始化,已经有了值了
// 静态属性创建时一定要有值或者默认值,不依赖类的实例化对他进行初始化
// 3.抽象属性:没有被初始化,默认值可以认为null,但不能给他赋值null否则会发生根本性变化,赋值后就不是抽象属性了
public $ages;
}
// 访问
$user = new User;
// -> 对象和成员访问符
echo "姓名:{$user->name}";
// 输出 姓名:micheal
// 在类的外部可以给类中的值进行更新
$name = 'kaiwen';
$user->name = $name;
echo "姓名:{$user->name}";
// 输出 姓名:kaiwen
echo $user->txt;
// 输出 我爱你中国
// 访问静态属性 适用范围解析符,双冒号::
echo User::$username;
// 输出 双倍快乐
// 静态属性也支持更新
User::$username = '不会快乐';
echo User::$username;
// 输出 不会快乐
2.2 按访问权限分类
序号 |
名称 |
关键字 |
类外部 |
类内部 |
类继承上下文 |
描述 |
1 |
公开成员 |
public |
允许 |
允许 |
允许 |
默认 |
2 |
受保护成员 |
protected |
禁止 |
允许 |
允许 |
封装 |
3 |
私有成员 |
private |
禁止 |
允许 |
禁止 |
封装 |
2.3 按调用主体分类
序号 |
名称 |
关键字 |
调用主体 |
1 |
非静态成员 |
默认 |
类实例调用 |
2 |
静态成员 |
static |
类调用 |
2.4 按是否有具体实现分类
序号 |
名称 |
关键字 |
具体实现 |
1 |
非抽象成员 |
默认 |
有 |
2 |
抽象成员 |
abstract |
无 |
- 类中只要有一个抽象方法,该类必须声明为抽象类
abstract class
- 严格来说未初始化的属性也应该算是抽象成员, 即: 抽象属性
- 思考: 有抽象属性的类,为什么不需要定义为抽象类呢?
- 普通属性通常会在类实例化通过构造方法进行初始化
- 静态属性由类调用而没有实例化的机会,所以定义时通常已经初始化
2.5 按方法是否可重写
序号 |
类型 |
关键字 |
描述 |
1 |
可重写方法 |
默认 |
可由子类重写 |
2 |
最终方法 |
final |
不允许子类重写 |
只有 "类和方法" 可声明为final , 属性不可以
3 类的分类
序号 |
类型 |
关键字 |
可实例化 |
可继承 |
可组合 |
1 |
常规类 |
class |
允许 |
允许 |
允许 |
2 |
最终类 |
final |
允许 |
禁止 |
允许 |
3 |
抽象类 |
abstract |
禁止 |
允许 |
允许 |
4 |
特征类 |
trait |
禁止 |
禁止 |
允许 |
5 |
接口类 |
interface |
禁止 |
允许 |
允许 |
6 |
匿名类 |
new class{} |
禁止 |
允许 |
允许 |
|