在属性和方法前,加上static修饰,这种称为静态属性和静态方法
从内存角度看:
Static属性,存放在类的区域中,普通属性,存放在对象中
1 类声明完毕,该属性就存在
2 因为类再内存中只有一个,因此静态属性有一个
<?php class Human{ static public $head = 2; } //现在没有对象,如何访问静态属性? //普通属性包在对象内,对象名->属性名 //静态属性放在类内部 echo Human::$head; //静态属性既然存在类内部 //1.类声明完毕,该属性就存在,不需要依赖于对象来访问 //2.类在内存中只有一个,因此静态属性也只有一个 ?> |
<?php class Human{ static public $head = 1; public function changeHead(){ Human::$head = 9; } public function getHead(){ return Human::$head; } } //当一个对象都没有,静态属性页已随类的声明而存在 echo Human::$head,‘<br/>‘; //1 //静态属性只有一个,受影响后,所有的对象都改变 $m1 = new Human(); $m1->changeHead(); $m2 = new Human(); $m3 = new Human(); echo $m2->getHead(),‘<br/>‘; // 9 echo $m3->getHead(),‘<br/>‘; // 9 ?> |
静态方法:
static public/protected/private function t(){
}
普通方法,存放在类内部,只有一份
静态方法,也是存在类内部的,也只有一份
区别在于:
普通方法,需要对象去调用,需要绑定$this,
静态方法,不属于那个对象,属于类,不需要绑定$this,通过类名调动
<?php error_reporting(E_ALL | E_STRICT); class Human{ static public function cry(){ echo "555555555<br/>"; } public function eat(){ echo "吃饭"; } } Human::cry(); Human::eat(); //Non-static method Human::eat() //should not be called statically ?> |
非静态的方法,是不能由类名静态调用的
但是PHP中的面向对象检测并不严格
只要该方法没有$this,就会转化为静态方法来调用
但是在PHP5.3的strict级别下,或者是PHP5.4 的默认级别下
都已经对类名,非静态方法做了提示
不能静态的去调用非静态方法
所以:
类访问静态方法:可以
类访问动态方法:方法内没有$this的情况下,但严重不支持,逻辑上讲不通
对象访问动态方法:可以
对象访问静态方法:可以
本文出自 “杜国栋个人PHP学习博文” 博客,请务必保留此出处http://duguodong.blog.51cto.com/7667978/1388672
时间:2014年4月1日14:43:19静态属性和静态方法,布布扣,bubuko.com
原文:http://duguodong.blog.51cto.com/7667978/1388672