时间:2014年4月1日14:43:19静态属性和静态方法


在属性和方法前,加上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.3strict级别下,或者是PHP5.4 的默认级别下

都已经对类名,非静态方法做了提示

不能静态的去调用非静态方法

所以:

类访问静态方法:可以

类访问动态方法:方法内没有$this的情况下,但严重不支持,逻辑上讲不通

对象访问动态方法:可以

对象访问静态方法:可以


你可能感兴趣的:(静态方法,静态属性)