面向对象-就是面向一个个包含了若干个方法的类,
一、类与对象
类可以看做是一个人的模板,是一个机器人,这个机器人有一些固定的属性,比如年龄,体重等,也可以没有,可以根据属性做很多事情,比如哭、笑,也可以不根据属性就做某些事情,比如吃、拉。。。或者根据一些别的指令(形参)干活,这个过程就是创建类,这个时候,我需要一个机器人去帮我干活,我就根据不同的模板,创造了一个有名字的机器人,这个机器人就具有唯一性了,这个过程就是生成对象,然后,当然就是让他根据模板里的设置去干活了
1、生成对象;
$对象名=new 类名();
$对象名,这个值其实并不是对象,它只是一个变量,等于是对象把值赋值给了这个变量
2、类;
(1)属性;就是变量,其值不能是表达式(1+2)的值,不能是函数的返回值,意思是,他的值虽然是变量,但是他不能进行计算,你可以告诉他1是1,但是不能和他说2-1是你的值,人家直接不跟你玩了,直接报错
(2)功能;就是方法,函数,与外部的函数可以重名,不冲突(最好不要。。)
声明语法;
class 类名{
变量(可以没有);
方法;
}
访问对象里的数据;$对象名->变量或方法();
注意,对象名、类名和方法名避免使用关键字,系统函数名等
方法里调用方法内部的另一个方法,要使用this-> 注明,否则,它会先检查方法外部有没有这个名字的方法
二、构造函数;__construct();(注意;前面是两个下划线)
class lei{
public function __construct(){
}
变量;
函数;
}
1、 作用,当new这个类,产生一个对象的时候,就会自动对这个新new出来的对象发挥作用,意思是,他会自动执行__construct这个函数里的代码
2、 构造函数;对象产生的时候,自动执行
class lei{
//设置形参,接收外部传进的参数
public function __construct($name,$sex){
//用形参对这个构造函数外,类里的变量进行赋值
$this->name=$name;
$this->sex=$sex;
}
//类里的变量,后面的函数方法会调用
public $name=null;
public $sex=null;
}
//生成一个对象,并穿进去实参
$a=new lei('飞哥','男');
//具体的操作(一般是执行变量后的方法)
echo $a->name;
这个构造函数的作用就是接收参数,并赋值给类里的变量,相当于一个连接器
3、 析构函数;__destruct().对象销毁的时候,自动执行
class lei{
public function __construct($name,$sex){
$this->name=$name;
$this->sex=$sex;
}
public function __destruct(){
}
public $name=null;
public $sex=null;
}
$a=new lei('飞哥','男');
echo $a->name;
如何销毁;
1、 主动销毁;显示的销毁unset,赋值为空(也可以赋别的值),如;
unset($a);
$a=NULL;
2、 被动销毁;php是脚本语言,在代码执行到最后一行时,所有申请的内存都要释放掉,自然,对象的那段内存也要释放,这是,对象被销毁了,
三、this;当一个对象调用其内部方法时,在方法执行前,先完成一个绑定,绑定到调用次方法的对象
方法内,存取对象的属性时,必须用$this,
四、封装;和安卓基本一样
1、属性封装;通过权限修饰符,把某些属性封装在一个类的内部,并通过指定的公共接口来访问
定义;
class Constants{
const name ="fei";
const sex ="nan";
}
访问;
CField::name;
2、调用某个公共方法时,改公共方法可能调用在内部的多个方法,但是调用者不需要指定内部的调用过程
五、继承、有一些必要的流程,是每个页面都需要的,这个时候,把这些流程写到一个类里,然后继承这个类,然后根据具体的情况,增添或修改这个类,就可以自动执行,
调用父类的属性方法;parent::属性名或方法名();
父类里有的,可以继承过来直接用,也可以修改/覆盖后使用,
父类没有的,可以自己添加
继承时,权限只能越来越宽松
构造方法也可以继承
父类有构造函数,子类也有自己的构造函数,第一步要先声明一下,
public function __construct() {
parent::__construct;
//然后再写自己要写的东西
}
六、多态、和Java类似
七、单例
class single {//创建单例类
static protected $ins=null;//创建一个变量
final protected function __construct() {//构造函数, final这个方法不能修改
//这里写你想干的事
}
static public function getInstance() {//static修饰的可以不new直接调
//判断这个变量还是不是原来的变量,也就是看看这个方法执行过没有,
if (self::$insinstanceof self) {
return self::$ins;//不是原来的值了,说明这个变量里的值已经是一个创建的实例了
}
self::$ins=new self();//创建一个实例赋值给变量
return self::$ins;
}
}
$make=single::getInstance();//调用
八、重写重载
1、重写、指子类重写了父类的同名方法,覆盖了父类的那个方法
2、重载、指存在多个同名的方法,但是参数的类型或个数不同,传不同的参数就会调用不同的方法,因为在php中不允许存在同名的方法,所以重载在php中不存在,但是可以做到类似的效果
class aa{
public function bb(){
$res=func_get_args();//func_get_args()这玩意可以计算传进来的是几个参数
if ($res==1) {//对参数的的个数进行判断,
....;//根据参数的个数,调用不同的方法
}
}
}
$li=new aa();
$li->bb(....);//这里的参数可以多个