zoukankan      html  css  js  c++  java
  • 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.构造方法可以当作普通方法由对象调用(不建议)。

  • 相关阅读:
    之前没弄明白的链表和return
    读Bsautiful Soup库有感
    Beautiful Soup库
    XML和JSON的系列操作
    urllib和requests的区别(持续更新)
    request请求把cookie当作参数传入请求
    Python统计文件夹下文件的个数
    基础算法之查找
    timeit用法(不完整)
    spring初识
  • 原文地址:https://www.cnblogs.com/xiaowie/p/12112007.html
Copyright © 2011-2022 走看看