类的基本语法:
class 类名 {
//类的主体
属性;访问修饰符+变量
方法;访问修饰符+函数
}
类名命名法:
1、帕斯卡命名法(大驼峰):首字母大写,后面每个单词的首字母大写
比如:UserName,PassWold(基本上是采用这种)
2、骆驼命名法:
- 首字母小写,后面每个单词的首字母大写
- 每个单词的首字母都小写,中间用下划线连接
比如:userName, user_name;
3、匈牙利命名法:
变量类型+变量名
比如:iAge, fnShow, sName;
属性和方法的调用
在OOP中,要调用属性和方法,必须要先有对象
class stu{
public $name='jim';
public $sex='man';
}
$ stu1=new stu();
$stu2=new stu();
echo stu1->$name //php7 的写法:stu1->name
$stu1->aa='beilasdkf'; // 属性的增加:
unset($stu2->name); //属性的删除
访问修饰符
- public(公用):可以在类的内部和外部访问;
- private(私有):只能在类的内部访问;
- protected(受保护):在类的内部和子类中访问(继承链上)
提示:在oop中,属性一般都是私有化,通过公有的方法对私有的属性进行访问和赋值。(原因是为了过滤数据)
class stu{
private $name='jim';
private $sex='man';
public function setInfo($name,$sex) {
//过滤数据
if($name==''){
echo 'name is null';
exit;
}
if($sex!='man'|| $sex!='women'){
echo 'sex is error!';
exit;
}
$this->name=$name;
$this->sex=$sex;
}
public function getInfo() {
echo $this->name;
echo $this->sex;
}
}
$stu1=new stu();
$stu1->setInfo('dd','man');
echo $stu1->getInfo();
封装
访问修饰符的目的就是为了封装,
封装的目的就是用来有选择性的提供数据和访问!
构造方法(构造函数)
区别于其他方法,在实例化对象的时候自动执行。用来初始化或者要自动运行一些动作。比如连接数据库!
语法:function __construct()
<?php
header('content-type:text/html;charset=utf-8');
class stu{
private $name;
private $sex;
public function __construct($name,$sex) {
$this->name=$name;
$this->sex=$sex;
}
public function getInfo() {
echo $this->name;
echo $this->sex;
}
}
$stu1=new stu('汤姆斯','男'); //自动调用构造函数
$stu1->getInfo();
$stu2=new stu('露西','女'); //只要实例化一次就调用一次
$stu2->getInfo();
继承
面向对象编程重要概念,子类可以继承父类所有属性和方法,但是不一定有权限调用。比如父类私有的属性和方法。
语法:class 子类名 extends 父类名
总结如下:
- 在子类中调用父类属性和方法,通常在父类的属性和方法使用protected修饰符。
- 调用父类的构造方法,如果子类没有构造方法,则默认使用父类构造方法。
- parent关键字,表示父类的名字。
- 子类给父类的构造函数传递参数: parent :: __construct(参数1,参数2,…)
- php不允许多重继承
- 静态成员可以被继承
this 关键字
表示对当前对象的引用,谁调用我就代表谁!表示当前对象。
class Goods{
public function __construct(){
var_dump($this);
}
}
class BOOK extends Goods{
}
new Goods(); // this 表示goods对象
newBook(); // this 表示Book对象
多态
面向对象三大特性:封装,继承,多态!
多态:表示多种形态,分为方法改写和方法重载,php不支持方法重载。
子类重写了父类同名的方法
- 子类方法名与父类方法名必须一致,
- 原则上子类父类同名方法参数个数必须一致,也可以不一致。
- 子类不能比父类访问权限更加严格,比如父类同名方法是public,子类不能用private;
私有属性继承和改写问题
如果子类与父类存在同名属性,如果属性是public修饰符,则子类属性将会覆盖父类同名属性(改写)
如果用private修饰,则无法被覆盖。对象中将存在两份属性。
方法修饰符
- static:静态属性,静态方法
1、普通属性不实例化不分配空间,static修饰的属性和方法,只要加载类就分配空间,不需要实例化就可以访问
2、访问静态成员的方法:类名::静态成员
3、静态成员在内存中只有一份,为所有示例共享数据。
4、静态方法中不能访问普通成员,只能访问静态成员。
5、static::静态成员, 称为延时绑定,static表示的是一个类,具体表示什么类在运行的时候确定,表示的是当前对象所在的类。
self关键字:表示当前类的名称,用来解耦
在类中用self关键字,当类名更改的时候,无需做调整,降低耦合性!
注意:普通方法被self::调用会自动转成静态方法。但是属性却不能这样做,属性加载的空间不一样。方法其实也是在加载类的时候被分配空间,属性是在实例化对象的时候才分配空间哦。
- final修饰符
final 修饰的类不能被继承;
final修饰的方法不能被重写;
- abstruct修饰符
- abstruct修饰的方法叫抽象方法,abstruct修饰的类叫抽象类
- 如果只有方法的声明而没有方法的实现称为抽象方法
- 如果一个类中有一个方法是抽象方法,那么这个类就是抽象类
- 抽象类不允许实例化,必须在子类中实现了才能实例化
抽象类的作用:
- 定义统一的方法
- 防止实例化
接口(interface)
- 如果一个类中所有方法都是抽象方法,那么这个类可以声明成接口
- 接口是一个特殊的抽象类
- 接口中的方法只能是public,默认也是public权限
- 通过implements类实现接口
- 不能通过final和abstruct修饰接口中的抽象方法
- 类不能多重继承在php中,但是接口可以多重实现。
- 继承类同时实现接口
注意:先继承类,后实现接口!
类常量(const)
类(接口)中可以放属性,方法,常量
参数约束
自动加载类
在项目中:实现自动加载类的前提
1、一个文件只存放一个类;
2、文件名与类名同名; 方便自动加载类文件
3、以.class.php结尾;
第一种情况:类文件放在同一目录下
当页面执行的时候,通过PHP核心程序判断用户脚本需要哪个类,如果没有找到,会自动调用__autoload()函数,
并且会将缺少的类名传递给 __autoload()函数,我们只需要在__autoload函数中加载缺少的类即可。
第二种情况:类存放地址不规则,可能存在多个不同的文件夹中
需要将类映射到数组中加载
第三种情况:通过文件命名规则加载类
实现的前提,将所有同性质的类放到一个特定命名的文件夹中,比如lib 文件夹放的都是工具类,model中放的都是模型类,并且类的命名都加上特定后缀。
单例模式
一个类只能有一个对象,目的是提供效率。
实现单例模式的方法:三私一公
项目级别的单例模式:
工厂模式
传递不同的参数,获得不同的对象
策略模式
传递不同的参数,调用不同的策略
魔术方法