• php面向对象基础 析构函数 对象传值 范围解析操作符 静态成员


    析构方法(了解)

      定义:析构__destruct(),也是一种类结构中特殊的方法,与构造方法一样,也是系统规定好的,只需要开发人员抄写一遍即可。对象被销毁时会自动调用

     1.析构方法实现:类中增加一个destruct()方法

    <?php
    
    class studentaa{
        public function __destruct()
        {
            echo __FUNCTION__;
        }
    }
    
    $obj=new studentaa();
    //注销对象的时候会返回析构函数的方法名称
    unset($obj);
    ?>

    析构方法调用:析构方法是在对象被销毁时自动调用,对象的垂死挣扎;

    析构方法是对象用来调用释放对象中的资源,不是用来删除对象的,

    析构函数也是普通方法,可以有对象直接调用(没有意义)。

      对象销毁情形

        保存对象的变量被用来保存其他数据,导致对象内存没有任何变量引用

        删除对象变量

        脚本执行结束:释放所有变量

    总结:析构方法是一种对象销毁时自动调用的方法

        析构方法是用来对象销毁自身所占用的资源。

    对象传值

      定义:对象传值,其实就是将保存对象的变量赋值给另外一个变量,在php中,对象的传值是引用传递的,即一个对象变量赋值给另外一个变量,两个变量指向同一个对象内存地址,即只有一个对象。

    对象传值就是保存对象的变量赋值给另外一个变量

      

    <?php
    
    class studentaa{
        public $name;
        public function __destruct()
        {
            echo __FUNCTION__;
        }
    }
    
    $s1=new studentaa();
    
    $s2=$s1;
    
    //验证两个变量是不是都指向同一个对象
    $s1->age=18;
    
    echo $s2->age;   //输出18  同一个对象
    var_dump($s1,$s2);
    
    
    ?>

    总结:对象传值是引用传值,一般情况下不会再相中用到;

    范围解析操作符

    定义:范围解析操作符,由两个冒号组成“::”,是专门用于类实现类成员操作的,可以实现类直接访问类成员

      1.类常量的普通访问尝试,尝试使用对象进行访问

      

    <?php
    
    class studentaa{
        public $name;
    
        const p=3.1415;
    }
    
    
    $s1=new studentaa();
    echo $s1->p;    //错误 $s1->p最终传婚的访问方式为:$p,这个在类中并不存在
    
    ?>

     以上案例可以看出,对象无法访问类常量,那是因为类常量的定义本身就是用来给类访问的,对象时用来访问属性和方法的,类常量的访问方式为:类名::常量名

    <?php
    
    class studentaa{
        public $name;
    
        const p=3.1415;
    }
    
    
    $s1=new studentaa();
    // echo $s1->p;    //错误 $s1->p最终传婚的访问方式为:$p,这个在类中并不存在
    
    echo studentaa::p;     //返回3.1415
    
    
    
    ?>

    分析:类常量是固定的,而对象属性是不同对象而不同的,成员方法简单的理解也是为属性本身进行加工的,因此有一些东西是专属于类的,而有部分内容是专门为对象提供的

    所以就会有不同的成员拥有不同的访问方式

    总结:

      1.类访问成员的方式是是私用范围解析才操作符::访问,有类名直接访问

      2.类本上是通过对同类对象的抽象而形成,所以属性和方法本身都是有对象来访问

      3.类也睡需要有一些自身的数据和操作,这些就有类进行访问

     

    静态成员

      定义:静态成员、使用static关键字修饰的类成员,表示该成员属于类访问,php静态成员有两种,静态属性和静态方法

    1.静态属性:在类中定义属性的时候使用static关键字修饰,访问的时候只能使用类+范围解析操作符+静态属性访问,静态的东西属于类,不会带入对象中。

    <?php
    
    class student{
        static $count=0;   //静态属性
    }
    
    
    //静态成员可以直接使用类访问,而不需要实例化对象
    echo student::$count;
    ?>

    2.静态方法:在类中定义方法的时候使用static关键字修饰,访问的时候使用类+范围解析操作符+静态方法名字()访问

    <?php
    
    class student{
        public static $count=0;   //静态属性
    
        //静态方法
        public static function show(){
            echo __FUNCTION__;
        }
    }
    
    
    
    //静态成员可以直接使用类访问,而不需要实例化对象
    echo student::$count;
    
    
    //访问静态方法
    student::show();
    ?>

    3.在类的内部也既可以访问静态成员,同样的使用类名+范围解析操作符+静态属性(静态方法())

    <?php
    
    class student{
        public static $count=0;   //静态属性
    
        //静态方法
        public static function show(){
            echo student::$count;   //类的内部也可以访问静态属性或静态方法
            
        }
    }
    
    
    
    //静态成员可以直接使用类访问,而不需要实例化对象
    echo student::$count;
    
    
    //访问静态方法
    student::show();
    ?>

    静态方法本质也是类中定义的方法,因此也可以使用对象进行访问,但是不建议

    <?php
    
    class tech{
        private static $count=0;
        public static function showbox(){
            echo tech::$count;
        }
    
    
    
    }
    
    $bb=new tech();
    //对象访问静态方法
    $bb->showbox();  //也可以使用对象调用静态方法  但是不建议这么操作
    
    ?>

    5.同理,方法也是在类内部,在编译时就存在,因此可以通过类进行访问,使用范围解析操作符,但是非常不建议(会报错,因为只允许访问静态成员和类常量)

    .

    <?php
    
    class tech{
        private static $count=0;
        public static function showbox(){
            echo tech::$count;
        }
        public function add(){
            echo 30+30;
        }
    
    
    }
    
    
    tech::add();  //返回60  但是报错了
    
    ?>

    6.静态方法本质是给类访问,所以不允许在静态内部使用$this对象

    <?php
    
    class tech{
        private static $count=0;
        public static function showbox(){
            echo $this.$count;     //不允许使用对象$this访问属性,致命的错误,静态方法 类::调用  不产生任何对象
        }
    }
    
    
    
    
    ?>

    总结:

      1.为了保障类能直接访问数据库和操作数据,可以在属性和方法前增加static关键字变成静态属性和静态方法

      2.类通过类名+范围解析操作符+静态成员的方法进行访问

      3.静态成员也受访问修饰限定符的限定,访问权限与普通属性和方法一样

      4.对象可以无条件访问静态方法,而类只能访问不带$this的普通方法(不建议)

      5.静态成员是给类访问的,非静态成员是给对象访问的

      6.静态成员的访问效率比非静态成员高,因此有种说法是能用静态的时候就不用非静态

  • 相关阅读:
    wrk压测工具使用
    Mac 抓包工具wireshark使用
    hadoop无法停止
    非root用户如何使用docker命令
    too many open files
    kafka性能测试1.0.0
    命令查看linux主机配置
    ELK(Logstash+Elasticsearch+Kibana)的原理和详细搭建
    分布式session实现
    NUC972裸机调试步骤
  • 原文地址:https://www.cnblogs.com/xiaowie/p/12160942.html
Copyright © 2020-2023  润新知