php类与对象属性,⽅法,构造
⾯向对象基础
思考:按照⾯向对象编程思想,先编写好对应的功能函数,然后再放到某个主体中,那么已经写好的函数如何放到某个主体中去呢?
⾯向对象关键字掌握:
定义:⾯共享对象关键字说明,即在⾯向对象西乡设计的程序中,有⼀些关键的结构⽤词,在⾯向对象中,关键结构包括以下⼏个:
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.构造⽅法可以当作普通⽅法由对象调⽤(不建议)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论