## 普通方法与静态方法调用区别 >[info] 类中的普通方法与静态方法,看似简单,实则复杂,有时让人匪夷所思~~ #### 1. 普通方法 * 创建类Demo,并定义一个公共普通方法:test1( ) * 调用语法: ~~~ //1. 创建对象 对象变量名 = new 类名 ; //2 调用方法 对象变量 -> 普通方法() ; 例如: $obj = new Demo(); echo $obj -> test2(); ~~~ >[info] 也可以将调用普通方法的二步合并为一步: ~~~ (new 类名) -> 普通方法(); 例如: (new Demo) -> test2(); ~~~ * 演示源码如下: ~~~ <?php class Demo{ //定义公共普通方法 public function test1(){ return 'Nomal method:test1'; } } //1.创建对象 $obj = new Demo(); //2.用对象来调用普通方法 echo $obj -> test1(); ~~~ * 运行结果: ~~~ Nomal method:test1 ~~~ * * * * * #### 2. 静态方法(static) * 创建类Demo,并定义一个公共静态方法:test2( ) * 调用语法: ~~~ 类名::静态方法名(参数列表) ; 例如: Demo::test2(); ~~~ * 演示源码如下: ~~~ <?php class Demo{ //定义公共静态方法 public static function test2(){ return 'Static method:test2'; } } //Demo类静态方法test2()调用 echo Demo::test2(); ~~~ * 运行结果: ~~~ Static method:test2 ~~~ >[warning] 注意:静态方法也可以像普通方法一样:用对象来调用,但不推荐这样做 * 例如,这样调用静态方法也是可以的: ~~~ $obj = new Demo(); echo $obj -> test2(); //test2()是静态方法 或者: echo (new Demo) -> test2(); ~~~ * 运行结果与使用:类::静态方法名()调用是一样的。 * * * * * #### 3. 普通方法中调用静态方法 >[info] 静态方法是所有对象所共享的,而普通方法是所有对象都可以调用的。所以,普通方法中调用静态方法是可以的。 * 演示源码: ~~~ <?php class Demo{ //定义公共普通方法 public function test1(){ //调用静态方法:test2() return self::test2(); } //定义公共静态方法 public static function test2(){ return 'Static method:test2'; } } //创建Demo类对象并调用普通方法test1() echo (new Demo) -> test1(); ~~~ * 演示代码说明: (1): 因静态方法可以像普通方法一样访问,所以也可以这样调用静态方法: ~~~ public function test1(){ //调用静态方法,不用self::test2() ,用$this -> test2() return $this -> test2(); } ~~~ (2): 创建对象与方法调用合并,好处就是省去了定义对象变量名。 >[info] 定义变量名称,是一件很痛苦的事,写代码越多越感有感触 ~~~ //创建Demo类对象并调用普通方法test1() echo (new Demo) -> test1(); ~~~ * * * * * #### 4. 静态方法中调用普通方法 >[info] 普通方法中可以访问静态方法,那么反过来是否成立呢? * 让我们来测试一下吧~~ * 现在我们修改一下源代码: ~~~ <?php class Demo{ //定义公共普通方法 public function test1(){ return 'Nomal method:test1'; } //定义公共静态方法 public static function test2(){ return $this -> test1(); } } //Demo类调用静态方法test2() echo Demo::test2(); ~~~ * 运行结果:出错啦!!! ~~~ Fatal error: Using $this when not in object context in 'php文件名'. ~~~ >[danger] 静态方法是属于类的,供所有该类的对象所共享。而普通方法是属于对象的。静态方法生成于编译前,这时对象未生成,因为通过对象访问的普通方法,当然也不能被访问! * 我们现在思考一个问题:静态方法中能否访问普通属性?答案是:不能!原因与这个相同。 * * * * * #### 5. 静态属性的访问 >[info] 静态方法中,只能访问静态属性,不能访问普通属性。但是普通方法中可以访问静态属性,这也上面介绍的:普通访问中可以访问静态方法的原理是一样的。 * 实例演示: ~~~ <?php class Demo{ public static $name = 'ThinkPHP'; //定义公共普通方法 public function test1(){ return self::$name; } //定义公共静态方法 public static function test2(){ return self::$name; } } //对象访问 echo (new Demo) -> test1(); // 返回:ThinkPHP echo (new Demo) -> name; // 返回:错误 //静态访问 echo Demo::test2(); // 返回:ThinkPHP echo Demo::$name; // 返回:ThinkPHP ~~~ >[danger] 尽管我们可以像调用普通方法一样,用对象调用静态方法,但却不能调用静态属性,一定要注意! * * * * * ### 总结: * 普通方法与静态方法的尽管写在一个类中,但却工作在不同的空间; * 普通方法可以访问静态方法,但反过就不行; * 静态属性必须静态访问,但静态方法除了静态访问外,也可以对象访问。