析构方法(了解)
定义:析构__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.静态成员的访问效率比非静态成员高,因此有种说法是能用静态的时候就不用非静态