php静态属性和静态方法

来源:互联网 发布:新西兰 购物 知乎 编辑:程序博客网 时间:2024/06/06 20:17

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

静态属性

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 />'; // 9echo $m3->getHead(),'<br />'; // 9

类的静态属性和普通属性

静态方法

static public/protected/private function t() {}

普通方法,存放于类内的,只有1份
静态方法,也是存放于类内的,只有1份

区别在于: 普通方法需要对象去调动, 需要绑定$this
即,普通方法,必须要有对象,用对象调动

而静态方法, 不属性哪个对象,属于类,因此不需要去绑定$this,
即, 静态方法,通过类名就可以调动

class Human {    public $name = '张三';    static public function cry() {        echo '5555';    }    public function eat() {        echo '吃饭';    }    public function intro() {        echo $this->name;    }}// 此时一个对象都没有Human::cry();   //55555/*下面这个eat方法是一个非静态方法,应由对象来调用但是呢,调用了,也没出问题*/Human::eat();  //吃饭/*接上,但从逻辑来理解, 如果用类名静态调用非静态方法比如 intro() 那么: $this 到底是指哪个对象???因此,直接报错Fatal error: Using $this when not in object context in D:\www\1109\08.php on line 45*/ Human::intro();   //error/*如上分析,其实非静态方法,是不能由类名静态调用的.但是! PHP中的面向对象检测的并不严格,只要该方法没有$this,就会转化静态方法来调用.因此,cry()可以调用.但是,在PHP5.3的strict级别下,或者PHP5.4的默认级别都已经对类名::非静态方法做了提示则会提示:Strict Standards: Non-static method Human::eat() should not be called statically 不能静态的去调用非静态方法*/Error_reporting(E_ALL|E_STRICT);Human::eat();// 动访问静$lisi = new Human();$lisi->cry(); // 5555/*类->访问->静态方法 可以类->动态方法  方法内没有this的情况下,但严重不支持.逻辑上解释不通.对象-->访问动态方法  可以对象-->静态方法     可以

下一节我们将举例分析

0 0
原创粉丝点击