静态属性
在属性和方法前,加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的情况下可以,
但是如果报错级别高时,会报错,不提倡使用
对象->访问动态方法 可以
对象->静态方法 可以
*/