本文共 7207 字,大约阅读时间需要 24 分钟。
面向对象是一个编程思想。编程思想有面向过程和面向对象
面向过程:编程思路集中的是过程上
面向对象:编程思路集中在参与的对象
以去饭馆吃饭为例:
面向过程:点菜——做菜——上菜——吃饭——结账——收拾
面向对象:服务员,厨师,客人
多学一招:OOP:面向对象编程(Object Oriented Programming,面向对象编程)OOA: 面向对象分析(Object-Oriented Analysis,OOA)OOD: 面向对象设计(Object-Oriented Design,OOD)
1、对象是具体存在的事物,对象是由属性(变量)和方法(函数)组成的
2、类是具有相同属性和行为的一组对象的集合
分析:做菜动作-----厨师对象-----厨师类
结论:我们在开发的时候,先写类,通过类创建对象,然后调用对象的属性和方法实现功能
类-----对象-----调用成员
注意:一个类可以创建多个对象
小结:
1、对象是由属性和方法组成的 2、类是所有对象的相同属性和方法的集合 3、在开发的时候先写类,通过类创建对象,通过对象调用方法和属性 4、一个类可以创建多个对象
语法:
class 类名{ //属性 //方法 //常量}类是由属性、方法、常量组成的,也可以说类成员有:属性、方法、常量
类名的命名规则:
通过new关键字来实例化对象
注意:对象的传递是地址传递
相等:结构和保存的值一样就相等
全等:指向同一个对象才是全等";var_dump($stu1===$stu2);//bool(false) $stu1和$stu2不是同一个对象echo "";var_dump($stu2===$stu3);//bool(true) $stu2和$stu3是同一个对象
属性的本质就是变量
通过->调用对象的成员
对象名->属性名
对象名->方法名()
[add] => 地址不详 )//操作属性//1、给属性赋值$stu->name='tom';$stu->add='北京';//2、获取属性的值echo '姓名:'.$stu->name,''; //姓名:tomecho '地址:'.$stu->add,''; //地址:北京//3、添加属性$stu->age=20;print_r($stu); //Student Object ( [name] => tom [add] => 北京 [age] => 20 ) echo '';//4、删除属性unset($stu->add);print_r($stu); //Student Object ( [name] => tom [age] => 20 )
方法的本质就是函数
"; } function test(){ echo "这是test方法"; }}$stu=new Student;$stu->show();$stu->test();
多学一招:1、方法前面public是可以省略的,如果省略,默认就是public的。2、属性前面的public不能省略3、变量写类里面叫属性,并且加public;函数写类里面叫方法,可不加public
用来控制成员的访问权限
修饰符 | 描述 |
---|---|
public(公有的) | 在类的内部和外部都能访问 |
private(私有的) | 只能在类的内部访问 |
protected(受保护的) | 在整个继承链上访问 |
多学一招:
一般来说,属性都用私有的,通过公有的方法对私有的属性进行赋值和取值作用:保证数据的合法性,过滤数据
name=$name;//$this表示当前对象 $this->sex=$sex; } //显示信息 public function getInfo(){ echo "性名:".$this->name,""; echo "性别:".$this->sex,""; }}//实例化$stu=new Student;$stu->setInfo('tom','男');$stu->getInfo();echo '
';$stu2=new Student;$stu2->setInfo('berry','女');$stu2->getInfo();
$this表示调用当前方法的对象
public $name; public $sex; public function show() { }}$stu1=new Student;//对象实例化,分配内存的过程$stu2=new Student;var_dump($stu1);//object(Student)#1 (2) { ["name"]=> NULL ["sex"]=> NULL }//显示属性,不显示方法$stu1->show();
1、栈空间段:
栈的特点是空间小但被CPU访问的速度快,用于存放程序中临时创建的变量。由于栈的先进后出特点,所以栈用来保存和恢复调用现场 我们可以把栈看成一个临时的数据寄存、交换的内存区,用于存储占用空间长度不变并且占用空间小的数据类型的内存段,例如:整型1、100、1000等在内存中占用的空间是等长的,都是32位4字节。此外,double、boolean等类型的数据都可以存储在栈空间段 2、堆空间段 堆用于存放进程中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减,用于存储数据长度或占用内存比较大的数据。例如:字符串、数组和对象就存储在这段内存中 3、初始化数据段 初始化数据段用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序静态分配的变量 4、代码段 代码段用来存放可执行文件的操作指令,也就是说它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只允许读取操作,而不允许写入(修改)操作。例如,程序中的函数就存储在这段内存中
对象类型的数据就是一种占用空间比较大的数据类型,并且是占用的空间不定长的数据类型,所以对象创建完成以后被存放在堆内存中,而堆内存是不可以直接存储的内存,但可以通过对象的引用名称访问对象中的成员
封装就是有选择性的提供数据
通过访问修饰符来实现封装
私有成员的访问就是在对象的内部声明一些操作私有属性的公有方法
这样,在对象的外部就可以将公有的方法作为访问接口,间接地访问对象内部的私有成员
构造方法也叫构造函数,当实例化对象的时候自动执行
语法:function __construct(){ }注意:前面是两个下划线
例题:
'; }}new Student(); //这是构造方法new Student(); //这是构造方法
注意:在其他语言里,与类名同名的函数是构造函数,在PHP中不允许这种写法
class Student { //和类名同名的方法是构造方法,PHP中不建议使用 public function Student() { echo '这是构造方法'; }}/*Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Student has a deprecated constructor in F:\wamp\www\6-demo.php on line 2这是构造方法严格模式不建议这么做*/
构造函数的作用:初始化成员变量
name=$name; $this->sex=$sex; } //显示信息 public function show() { echo "姓名:{ $this->name}"; echo "性别:{ $this->sex}"; }}//实例化$stu=new Student('tom','男');$stu->show();
注意:构造函数可以带参数,但不能有return
当对象销毁的时候自动调用
语法:
function __destruct(){ }
注意:析构函数不可以带参数
例题:
name=$name; echo "{ $name}出生了"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了"; }}//测试$stu1=new Student('tom');$stu2=new Student('berry');$stu3=new Student('ketty');echo '
';
当堆内存段的对象失去访问它的引用时,就不能被访问;了,也就成为垃圾对象
通常对象的引用被赋予其他的值或者是在页面运行结束时,对象都会失去引用 在PHP中有一种垃圾回收的机制,当对象不能被访问时就会自动启动垃圾回收的程序,收回对象在堆中占用的内存空间 而析构方法正是在垃圾回收程序对象之前调用的,通常用来完成一些在对象销毁前的处理任务
//测试$stu1=new Student('tom');$stu1=null;$stu2=new Student('berry');$stu3=new Student('ketty');echo '
';
计算机内存管理方式:先进先出,先进后出
先进先出的内存管理方式一般用在业务逻辑中,比如秒杀、购票等等
先进后出是计算机的默认内存管理方式,函数也是先进后出
思考题1
name=$name; echo "{ $name}出生了"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了"; }}//测试$stu1=new Student('tom');$stu2=new Student('berry');$stu3=new Student('ketty');unset($stu2);echo '
';/*tom出生了berry出生了ketty出生了berry销毁了ketty销毁了tom销毁了*/
思考题2
name=$name; echo "{ $name}出生了"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了"; }}//测试new Student('tom');//没有变量引用的值就是垃圾new Student('berry');new Student('ketty');/*tom出生了tom销毁了berry出生了berry销毁了ketty出生了ketty销毁了*/
思考题3
name=$name; echo "{ $name}出生了"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了"; }}//测试$stu=new Student('tom');$stu=new Student('berry');$stu=new Student('ketty');/*tom出生了berry出生了tom销毁了ketty出生了berry销毁了ketty销毁了*/
语法
class 子类 extends 父类{ }
例题
'; }}//子类继承父类class Student extends Person { }//测试$stu=new Student;$stu->show(); //这是人类
执行过程:
第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找
第二步:在Person类中查询show()
2 子类中调用父类成员
'; }}//子类class Student extends Person { public function test() { //方法一; /* $person=new Person(); $person->show(); //这是人类 */ //方法二 $this->show(); //这是人类 }}//测试$stu=new Student;$stu->test();
小结:
1、方法一:通过实例化父类调用父类的成员
2、方法二:通过$this关键字调用父类的成员
'; }}//子类class Student extends Person { public function test() { //方法一; /* $person=new Person(); $person->show(); //这是人类 */ //方法二 $this->show(); //这是人类 }}//测试$stu=new Student;$stu->test();
小结:
1、方法一:通过实例化父类调用父类的成员
2、方法二:通过$this关键字调用父类的成员
protected:受保护的,在整个继承链上使用
例题:
//例题一: num; }}//测试$obj=new B(); //整个继承链上有A和B$obj->getNum(); //10//例题二: num; }}class B extends A { protected $num=10; }//测试$obj=new B(); //整个继承链上有A和B$obj->getNum(); //10//例题三: num; }}class B extends A { protected $num=10; }//测试$obj=new A(); //整个继承链上只有A$obj->getNum(); //Notice: Undefined property: A::$num
规则:
1、如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造函数。
2、子类的构造函数调用后,默认不再调用父类的构造函数
通过类名调用父类的构造函数
类名::__construct()
例题
'; }}class Student extends Person { //子类的构造函数 public function __construct() { Person::__construct(); //通过父类的名字调用父类的构造函数 parent::__construct(); //parent表示父类的名字 echo '这是子类'; }}//测试new Student();
注意:parent关键字表示父类的名字,可以降低程序的耦合性
例题:给父类传递参数
name=$name; $this->sex=$sex; }}class Student extends Person { private $score; //子类的构造函数 public function __construct($name,$sex,$score) { parent::__construct($name,$sex); //调用父类构造函数并传递参数 $this->score=$score; } //显示信息 public function getInfo() { echo "姓名:{ $this->name}"; echo "性别:{ $this->sex}"; echo "成绩:{ $this->score}"; }}//测试$stu=new Student('tom','男',88);$stu->getInfo();/*姓名:tom性别:男成绩:88*/
$this
表示当前对象的引用,也就是说$this
保存的当前对象的地址
';new B(); //object(B)#1 (0) { }
PHP不允许多重继承,因为多重继承容易产生二义性
c++和go允许继承
转载地址:http://miiv.baihongyu.com/