php

thinkphp中普通方法与静态方法调用区别

2023-08-26

1. 普通方法

创建类Demo,并定义一个公共普通方法:test1( )

调用语法:

//1. 创建对象

对象变量名 = new  类名 ;

 

//2 调用方法

对象变量 -> 普通方法() ;

 

例如:

$obj = new Demo();

echo $obj -> test2();

也可以将调用普通方法的二步合并为一步:

  (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

注意:静态方法也可以像普通方法一样:用对象来调用,但不推荐这样做


例如,这样调用静态方法也是可以的:

$obj = new Demo();

echo $obj -> test2();   //test2()是静态方法

 

或者:

echo (new Demo) -> test2();

运行结果与使用:类::静态方法名()调用是一样的。

3. 普通方法中调用静态方法


 静态方法是所有对象所共享的,而普通方法是所有对象都可以调用的。所以,普通方法中调用静态方法是可以的。


演示源码:

<?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): 创建对象与方法调用合并,好处就是省去了定义对象变量名。


定义变量名称,是一件很痛苦的事,写代码越多越感有感触


//创建Demo类对象并调用普通方法test1()

echo (new Demo) -> test1();

4. 静态方法中调用普通方法


普通方法中可以访问静态方法,那么反过来是否成立呢?


<?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文件名'.

静态方法是属于类的,供所有该类的对象所共享。而普通方法是属于对象的。静态方法生成于编译前,这时对象未生成,因为通过对象访问的普通方法,当然也不能被访问!


静态方法中能否访问普通属性?答案是:不能!原因与这个相同。


5. 静态属性的访问


静态方法中,只能访问静态属性,不能访问普通属性。但是普通方法中可以访问静态属性,这也上面介绍的:普通访问中可以访问静态方法的原理是一样的。


实例演示:

<?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

尽管我们可以像调用普通方法一样,用对象调用静态方法,但却不能调用静态属性,一定要注意!


总结:

普通方法与静态方法的尽管写在一个类中,但却工作在不同的空间;

普通方法可以访问静态方法,但反过就不行;

静态属性必须静态访问,但静态方法除了静态访问外,也可以对象访问。