静态属性

在属性和方法前,加static修饰,这种称为静态属性/静态方法

<?php

class Human
{
	static public $head = 1;

	public function changeHead(){
		Human::$head = 9;
	}

	public function getHead(){
		return Human::$head;
	}
}
/*
现在没有对象,想访问静态的$head属性

普通属性包在对象内,用对象->属性名 来访问
静态属性放在类内,

静态属性既然存放于类空间内,
1.类声明完毕,该属性就已经存在,不需要依赖于对象而访问
2.类在内存中只有一个,因此静态属性也只有一个
*/

//当一个对象都没有,静态属性也已随类声明而存在
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{
	public $name = '张三';
	static public function cry(){
		echo "555<br />";
	}

	public function eat(){
		echo "eat";
	}

	public function intro(){
		echo $this->name;
	}
}

//此时一个对象都没有

Human::cry();


/*
下面这个eat方法是一个非静态方法,应由对象来调用
但是呢,调用了,也没出问题
*/

// Human::eat();


/*
接上,但是从逻辑来理解,如果用类名静态调用非静态方法
比如:intro()
那么:$this到底是指哪个对象?

因此直接报错
 Using $this when not in object context in D:\wamp2\www\PHPoop\494static2.php on line 34

*/

//Human::intro();

/*
如上分析,其实非静态方法,是不能由类名静态调用的
但是在PHP中面向对象检测的并不严格,
只要该方法没有$this,就会转化为静态方法来调用
因此,cry可以调用

但是,在PHP5.3的static级别下,或者php5.4的默认级别下
都已经对类名::非静态方法做了提示
*/


//动访静
$lisi = new Human();
$lisi->cry();


/*
类->访问->静态方法 可以
类->动态方法    方法内没有this的情况下可以,
但是如果报错级别高时,会报错,不提倡使用

对象->访问动态方法 可以
对象->静态方法 可以
*/