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
尽管我们可以像调用普通方法一样,用对象调用静态方法,但却不能调用静态属性,一定要注意!
总结:
普通方法与静态方法的尽管写在一个类中,但却工作在不同的空间;
普通方法可以访问静态方法,但反过就不行;
静态属性必须静态访问,但静态方法除了静态访问外,也可以对象访问。