PHP基础13-类与对象

面向对象

引入例子 :女娲 人身蛇尾 , 用女娲造人引出类和实例 : 女娲造人前先 思考 人的形象 然后再造人
所以 :人的形象是抽象的,用来说明人的特点;而每一个人都是具体的,且符合人的形象

类 :所有对象共同点的一个抽象!(就是一个 制造说明书)
对象 :就是根据说明书制造出来的具体对象

类中有什么? 属性(比如人:身高,体重,姓名)
能干什么?功能(说活,吃饭)
用 变量 和 函数 分别模拟 属性 和 功能
面向对象中 ,方法即是函数 ; 属性即是变量 ,只是面相对象中一般说方法和属性

类的命名空间

不同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 受保护的(保护成员修饰符) 子类可以访问 类外部不可以访问