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.构造方法可以当作普通方法由对象调用(不建议)。

 

posted @ 2019-12-28 15:52  WhiteSpace  阅读(2998)  评论(0编辑  收藏  举报