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.静态成员的访问效率比非静态成员高,因此有种说法是能用静态的时候就不用非静态