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

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

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


总结:

  • 普通方法与静态方法的尽管写在一个类中,但却工作在不同的空间;
  • 普通方法可以访问静态方法,但反过就不行;
  • 静态属性必须静态访问,但静态方法除了静态访问外,也可以对象访问。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值