面向对象基础
思考:按照面向对象编程思想,先编写好对应的功能函数,然后再放到某个主体中,那么已经写好的函数如何放到某个主体中去呢?
面向对象关键字掌握:
定义:面共享对象关键字说明,即在面向对象西乡设计的程序中,有一些关键的结构用词,在面向对象中,关键结构包括以下几个:
1.类:class,是定义面向对象主体最外层结构,也是用来包裹主体数据和功能(函数),类是一类具有共性事务的代表,代表的是事务的共性。
2.对象:object,是某类事务的具体代表,也是实际数据和功能操作的具体单元,也被称为实例(instance)。
3.实例化:new,从一个抽象的概念得到一个符合抽象概念的具体实例过程。
4.类成员:member,指类class结构中的所有内容,类成员里有三种;
方法:method,本质是在类class结构中创建的函数,也称为成员方法,或者成员函数。
属性:property,本质是在类class结构中创建的变量,也称为成员变量。
类常量:constant,本质是在类class在结构中创建的常量。
<?php //使用class关键字 定义类 class Myclass{ //定义类的属性,前面必须要加访问修饰符 public $name='杜威'; //定义类的函数(方法),前面可以省略访问修饰符,默认是public public function show(){ //在方法中向访问属性,可以使用$this。 echo $this->name; //也可以使用这种 // $mynme=new Myclass(); // echo $mynme->name; } } //使用new关键字实例化类Myclass,下面两种方法都是可以的, //由于实例化对象没有保存,所以输出的时候都会显示 object (Myclass)[1] // new Myclass; // new Myclass(); $sb=new Myclass(); $sb->show(); //输出杜威 ?>
访问修饰符
定义:访问修饰符,是一种用在属性或这方法前的修饰关键字,是用来控制属性或者方法的访问位置的,在php中访问修饰符分为三种:public private和protected
1.首先需要明白一组概念类的内部和外部。
类内部:是指类定义的内容内部,即类名后{}内部。
类外部:是指类定义的外部内容,即类名后{}之外的所有地方。
类成员的访问权限控制是内部访问(私有的)。链内部访问(受保护)和全部访问(公有)。
public:公有,及表示所修饰的内容,(属性或者方法)可以在当前类的内部访问,也可以在类的外部访问。
<?php class Myclass{ public $name='duwei'; //内部和外部都可以访问 } $ff=new Myclass(); echo $ff->name; //正常访问 输出duwei ?>
protected:受保护的,即表示所修饰的内容只能在类的内部访问(到继承的时候在详细描述)
<?php class Myclass{ protected $name='duwei'; } $ff=new Myclass(); echo $ff->name; //错误 受保护的不允许在类的外部访问。 ?>
private:私有,即表示所修饰的内容只能在当前类的内部访问。
<?php class Myclass{ private $name='duwei'; //私有 } $ff=new Myclass(); echo $ff->name; //错误 私有属性,不能在当前类外部访问。 ?>
<?php class Myclass{ private $name='duwei'; //私有 //我们可以通过方法来引用name属性 public function showName(){ echo $this->name; } } $ff=new Myclass(); echo $ff->showName(); ?>
类内部对象$this和内存原理
定义:类成员属性和方法的访问必须通过对象才能访问,类外部可以通过实例化得到类对象从而实现成员访问,但是类内部不能访问类外部的对象(未知),此时类的内部就内置了一个对象$this
代表来访问对象
<?php class Myclass{ public $name='duwei'; public $age=32; public function showName(){ // echo $name.$age; //全部错误,提示定义变量 //类中的属性必须要以对象的形式来调用。 // global $ff; //把外面的对象ff 引入进来使用 // echo $ff->name,$ff->sge; //使用$this类内部对象引用 echo $this->name,$this->age; } } $ff=new Myclass(); echo $ff->showName(); ?>
思考这样一个问题,类一开始就定义好,但是对象实例化是在需要使用该类的时候来调用的,如何保证外部保存对象的变量一定是$ff呢?,对象可以创建多个,如果有多个对象变量,那内部怎么实现呢?
如果系统内部能够检测到是哪个对象在调用方法,并且能够复制对应对象就好了,这个就是类成员方法内置对象$this
$this class和new之间的关系原理
class是定义类结构,属于非执行段代码,因此会被加载到代码段(编译阶段)。
new是实例化对象,先判断类在内存(代码段)是否存在
类不存在,报错
类存在,将类内部的属性部分复制一份,然后在内存(堆区)开辟一块内存空间,将属性放到里面,同时内部有一个指针指向类的内存空间(代码段)。
对象访问属性即访问的是对象空间存储的部分。
$this是系统在方法内置的对象通用名字
对象在调用方法的时候,系统会自动找到对象所保存的内存地址(堆区),然后把地址复制给$this
方法内部的$this就代表调用当前$this所在方法的外部对象
$this的本质是函数内部的一个局部变量,只是系统自动对其进行赋值,而且一定是调用方法的对象本身。
构造函数(__construct())
构造方法__construct() 是一种类结构特殊方法,该方法由系统规定好,开发人员定义的时候只需要抄写一遍,有了构造方法的类在实例化对象之后,对象就会自动调用
1.构造方法实现;在类中增加一个__construct方法即可
<?php class student{ public $name="duwei"; private $age; function __construct() { echo $this->name; } } new student(); //输出duwei ?>
构造方法也是一个普通的方法,不普通的地方在于,类实例化得到的对象会马上自动调用。
构造方法的意义:构造方法是对象实例化的时候用来初始化对象的资源的,所以通常用来初始化对象的属性或者其他资源的初始化。
<?php class student{ //属性 public $name; private $age; public $sex; function __construct($name,$age,$sex) {
//写死
//$this->name='杜伟'; //初始化属性 $this->name=$name; $this->age=$age; $this->sex=$sex; } function show(){ echo $this->name,$this->age,$this->sex; } } //实例化 $obj=new student('杜伟',38,'男'); $obj->show(); ?>
如果属性的数据在构造函数中初始化时固定写死的,那么与直接在定义类的时候初始化属性是一样的,意味着数据没有任何价值(所有对象都相同),因此是通过构造函数的参数来实现数据的外部导入。
一旦构造方法拥有的参数,那么对象在调用该方法的时候就需要传入对应的实参,而构造方法又是自动调用的,所以需要在实例化对象的时候使用new类名(构造方法对应的实参列表)来实现
<?php class student{ //属性 public $name; private $age; public $sex; function __construct($name,$age,$sex) { //初始化属性 $this->name=$name; $this->age=$age; $this->sex=$sex; } function show(){ echo $this->name,$this->age,$this->sex; } } //实例化 $obj=new student('杜伟',38,'男'); $obj->show(); //实例化wangy $wangy=new student("王玥",33,"女"); $wangy->show(); ?>
注意:之前所说的new 类名和new 类名() 没有区别是因为没有构造方法,或者构造方法没有参数限定,一旦构造函数方法有了参数,那么new类名 就不能直接使用了
构造方法不管在怎么特殊,也是用户定义的方法,言外之意除了在实例化对象时对象会自动调用之外,我们也可以手动调用构造方法(但是一般没有价值,因为对象实例化时会自动调用)
//实例化 $obj=new student('杜伟',38,'男'); $obj->show(); //实例化wangy $wangy=new student("王玥",33,"女"); $wangy->show(); $wangy->__construct("xia",36,"女"); //没有意义
总结
1.构造方法__construct()是一种系统内置的方法,该方法的特性是会在对象实例化之后,自动调用
2.构造方法的目的就是初始化资源,包含对象属性和其他资源
3.一旦构造方法定义好之后,且构造方法自带参数,那么就只能使用new 类名(参数列表)方式才能正确实例化
4.构造方法可以当作普通方法由对象调用(不建议)。