PHP面向对象(一)
个人分类: PHP
self-----------代表类本身,只能在当前类内部的函数中使用,代表代码所在的类;
$this----------代表当前类的当前对象(在对象调用的方法中使用$this 就代表哪个类的对象),在子类对象调用继承自父类的方法时,方法中的$this 是子类的对象;;如果是在static静态方法中,不能使用;
static-------作用1:静态变量; 作用2:静态方法;静态方法中不能调用非静态方法;作用3:调用的是static所在的这个个方法,哪个类调用这个方法,static就代表这个类,作用4:静态绑定;
parent------代表父类,
类中只有个三种成员:属性,方法,常量;
除了这三种成员外,其他的如流成控制语句if ,while,for,case等都只能在函数中使用;
类中的属性 前面要加上var ;类之外的变量不需要加var ;
访问修饰符:public,protected,private;----不写默认是public;
调用:对象->属性;(不加$)
对象->方法;
注意方法4 不加括号;
对象的变量进行普通传值得时候,复制的是对象变量中所存储的对象标识符;对象标识符指向真正的数据;
-------------------------------------------------------------------------
对象的属性可以定义不赋值,不能是表达式和变量,可以是直接值和常量;前面必须加上public或var;
变量必须定义的同时赋值;
定义属性时 $前面必须要加上var 或public,
在函数中计算的时候用 $变量名 就可以了;
定义属性的时候要加var $或者 public $;在调用属性的时候不要加var $或者 public $;
pow(9,0.5);----------------9的0.5次方
$this 是一个伪对象,代表当前类的当前对象;
-----------------------------
------------------静态属性-----------------------------------------
静态属性隶属于类本身,同一个类的所有对象共享数据;
静态属性的调用-------------用类名去调用********类名::$静态属性名;
静态属性的调用-------------用对象去调用********对象名::$静态属性名;
----------------------通过对象也可以使用静态属性--------------------
获取对象所属的类名:get _class();
只是得到一个类的名称,并不能得到这个类;
----------------静态方法-----------------------
静态方法属于类,所有对象共有;
静态方法的调用-------类名::静态方法名();
对象亦可以调用静态方法------对象名::静态方法名();
静态方法中不能使用$this;静态方法中不能调用非静态方法;
类调用一般的非静态方法或静态变量,只能在自己的类中调用,其他地方调用会报错;类调用静态方法可以在任何地方;
$this----------代表当前类的当前对象;如果是在static静态方法中,通过类名调用静态方法不能使用$this;静态方法是用类调用,此时没有对象;
静态方法中不能调用非静态方法,静态方法中可以用self(代表当前类),通过类名调用的静态方法不能用$this;一般方法中可以用this(代表当前对象)
==============构造方法=============
new的时候,会自动调用__construct($n,$a);如果定义构造方法,则调用时的实参必须和构造方法的参数个数一致;
如果不实现__condtruc()构造方法,系统会默认执行父类的构造方法;如果父类没有,就一直往上找,最终找到系统的不带参数的构造方法,那么就对结果没有影响;
$p=new p("lisi",18);//用构造方法创建一个对象;
==============析构方法=============
析构方法不能手动调用,在销毁对象unset()时会自动调用,析构方法可以用于清理一些在PHP代码结束后不能清理的数据,如生成的文件;
程序结束的时候,所有对象被销毁,会调用析构方法;销毁对象unset()时也会调用析构方法;改变对象变量的值,原来变量指向的对象没有被变量指向,就会销毁对象,也会调用析构方法;
function __destruct(){
}
PHP程序结束后,PHP所有的对象自动销毁,析构方法是PHP内部的垃圾回收机制;
总结:
子类中没有定义构造方法会自动调用父类的构造方法,实例化子类的时候会按照父类的构造方法进行;
子类中定义了自己的构造方法,则不会自动调用父类的构造方法,但是可以手动调用parent ::__construct();
析构方法和构造方法用法相同。
------------------类的继承-----------------------
类的继承: Class A类 extends B类{
}
访问修饰符---------------------------------------------
上面的例子是子类访问父类的属性$p1;
下面这个例子是父类访问子类的属性$p2,但是不常用;要注意:
protected收保护的,只能在当前类或者有继承关系的上下级使用;
private修饰符只能在本类中使用:
parent,self,this--------------------------------
parent : : 父类的方法;
self :: 自己的方法或者继承父类的方法;
$this ->自己的方法或者继承父类的方法;
系统有默认的构造方法:function __construct(){ },如果自己在类中实现 了构造方法,就会覆盖系统的构造方法;
子类中没有定义构造方法会自动调用父类的构造方法,实例化子类的时候会按照父类的构造方法进行;
子类中定义了自己的构造方法,则不会自动调用父类的构造方法,但是可以手动调用parent ::__construct();
析构方法和构造方法用法相同。
//=================链接数据库==============
-------------------重写override-------------------------
重写针对的是非构造方法和非析构方法;
将从父类继承下来的属性和方法重写或者覆盖;覆盖是建立在继承的基础上,如果没有继承,谈不上覆盖重写了;
访问控制的权限不应该低于上一级的权限;
重写的普通方法的参数个数必须和父类的参数个数一致,参数的名字可以写成不一样的;
构造方法可以重写,参数也可以不一致;
私有的属性和私有的方法,不能覆盖,但子类可以定义和父类同名的方法和属性,但是只作为当前类的自有属性;
-------------最终类和最终方法----------------------------
最终类不能被继承,最终方法不能被重写;
---------------------设计模式-----------
工厂方法:
file_exists--------判断文件是否存在;
单利模式:
关键点:private 构造方法,private clone方法;
构造方法私有了,只能在类内部使用,外部new的时候就不会调用,这样就创建不了对象;
clone 是运算符,复制一个对象;new也是运算符;他们两个的优先级最高;
注意:上面 的clone $o1是运算符,不是类中默认的clone方法,在做单利的时候必须把默认的 function __clone(){}方法private,执行clone $o1 时,类中默认的clone方法才不会执行,否则,就会执行系统默认的clone方法;
构造方法,clone方法都叫魔术方法(就是系统默认的隐藏的方法);
========抽象类,抽象方法===========
抽象类专门做父类,子类继承他;
=============重载是在同一个类中;重写是在不同的类中;
上面:$o1->p2=2不存在,先调用下面一个set,然后不不存在的属性和值存起来,然后$o1->p2不存在,又再调用上一个get,从而得到数组中值;
方法重载:使用对象调用一个不存在的方法时。
在类中可以调用类外面并且不是类中的方法。
==============接口----------------
接口可以实现多继承,类不能实现多继承;接口的作用就是统一;
类实现接口;
一个类只能继承一个父类,但是可以实现多个接口;
----------------自动加载技术和克隆技术--------------
第一种方法:
第二种方法:
---------------对象的复制:
浅克隆:克隆的是非对象非资源数据;
深度克隆---------------
PHP中默认克隆是浅克隆,要想一个对象的所有属性数据都被克隆,就需要使用魔术方法__clone()里面实现深度克隆;
对象的遍历:
对象遍历只能遍历属性:
自定义遍历(局部遍历):
------------------------PHP内置标准类:
内置标准类:new stdclass();
对象类型转换-------其他类型转换成对象:
纯字符下标的数组才适合转换成对象。数字下标的数组转成对象,不能通过数字下标访问属性;
标量转换成对象:
PHP是弱类型语言,无需为变量指定类型;PHP中只能对对象,接口,数组,函数进行约束;
类型约束:
get_class(对象)也可以获取类名,但是必须要有一个对象;
==================数据序列化:===============
序列化:$str=serialize($变量);
将文件存储起来:file_put_contents("文本文件路径",$str);
反序列化:
类和对象的系统函数:
static 的不同用法:
多态: