引入例子 :女娲 人身蛇尾 , 用女娲造人引出类和实例 : 女娲造人前先 思考 人的形象 然后再造人
所以 :人的形象是抽象的,用来说明人的特点;而每一个人都是具体的,且符合人的形象
类 :所有对象共同点的一个抽象!(就是一个 制造说明书)
对象 :就是根据说明书制造出来的具体对象
类中有什么? 属性(比如人:身高,体重,姓名)
能干什么?功能(说活,吃饭)
用 变量 和 函数 分别模拟 属性 和 功能
面向对象中 ,方法即是函数 ; 属性即是变量 ,只是面相对象中一般说方法和属性
类的命名空间
不同PHP文件有同名的类,可以使用类的命名空间
如何创建对象
new 类名();//直接产生一个对象并返回该对象。也可以不加括号(new 类名:)
$a = new 类名(); //那么a对象就包含 类中声明的所有属性(类似关联数组)
成员属性
成员属性可以是基本数据类型(整数,小数,字符,布尔),也可以是复合数据类型(数组,对象)
调用
要调用对应的属性值可以 $a -> name (name不用$);要调用对应的方法 $a -> say()
语法
语法就是法律; 规范 就是 道德
- (1)属性的初始化 不能是表达式 如 : $a = 1+3 ; java中是允许的
- (2)同一个域内(比如一个类中),函数不能重复定义(即是名字不能一样)
- (3)在一个类里面,如果要调用系统同名的自定义函数,需要用$this,否则调用系统函数 ; 此外一个类里面 一个函数调用 不是他内部的变量或者它调用其他函数也要加 $this
方法的参数形式和传递方式
方法的参数可以是基本数据类型、数组和类对象。
基本数据类型:值参传递
数组:值参传递
类对象:引用传递
类的构造方法
__construct() , 注意前面是两个下划线 ; 当new对象(产生对象),自动调用 ; 构造函数不能被重载即是不能再有同名的
例1:
class Person{
public $name;
public $sex;
public $age;
function __construct($name,$sex,$age){
echo “我是构造函数
“;
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
范例:2
因为构造函数有两个参数,且构造函数会自动调用,所以用new创建对象时,要给对象传入相应的参数。构造函数实现了将传进的参数赋值给类的属性,因此最终调用getnames()函数时会输出传入的名字。
//注意:
this绑定
当一个对象调用一个它对应类的方法时,该方法执行之前先完成一个绑定,即是用
$this绑定到调用此方法的对象(这样才能在方法内对这个对象的属性进行操纵),因为方法内如果想访问调用者(即是对象)的属性必须用$this;否则则理解为方法内部的一个局部变量
Java中不一样,函数不需要this也能访问方法外的变量
析构函数
当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。应在退出前在析构函数中用释放内存。
析构函数__destruct 析构函数没有任何参数
如何销毁对象 :
1、显式销毁,unset(),直接赋值为null或者其他值
2、执行完最后一行代码时自动销毁(如果之前已经销毁,则不再销毁)
对变量指向销毁问题
$a = new People(); //创建一个对象(new People()),并把使用权给变量$a($a是一个变量名,指向这个对象)
$a = $b = $c ; //3个变量都指向内存中的同一个对象
unset($a);//unset,即是销毁对象(object),但有其他变量$b等仍然指向对象,那么该对象将不能被销毁,但是$a为null不再指向这个对象
static
不需要创建实例对象,直接使用
一般当某个属性或者方法 是所有对象固有的(即是不改变),则声明为静态属性,节省内存,随时类名调用;无论函数调用多少次,只初始化第一次.,如 static $a = 1;
调用:
类名::变量名/方法 //类内部与类外部都可以访问的
self::变量名/方法 //只能类内部使用
self, parent的用法 (::(域运算符号))
self:指向类本身,也就是self是不指向任何已经实例化的对象 ,self使用来指向类中的静态属性或者方法
self::$staticProperty
self::staticMothed;
parent: 指向父类的指针,一般我们使用parent来调用父类的构造函数。
在引入自身的静态属性/静态方法,以及父类的方法时,可以用到.
parent::$staticProperty
parent::Mothed;
★应该选择this还是parent
访问权限
public 公共的(公共修饰符) 类内部与类外部都可以访问的
private 私有的(私有修饰符) 只能在类内部访问
protected 受保护的(保护成员修饰符) 子类可以访问 类外部不可以访问