一、static关键字
这里说明了用 static 关键字来定义静态方法和属性。static 也可用于定义静态变量以及后期静态绑定。参见上述页面了解 static 在其中的用法。
static静态的,修饰类的属性方法,称静态资源
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。
就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
静态属性示例
<?php class Foo { public static $my_static = 'foo' ; public function staticValue () { return self :: $my_static ; } } class Bar extends Foo { public function fooStatic () { return parent :: $my_static ; } } print Foo :: $my_static . " " ; $foo = new Foo (); print $foo -> staticValue () . " " ; print $foo -> my_static . " " ; // Undefined "Property" my_static print $foo :: $my_static . " " ; $classname = 'Foo' ; print $classname :: $my_static . " " ; // As of PHP 5.3.0 print Bar :: $my_static . " " ; $bar = new Bar (); print $bar -> fooStatic () . " " ; ?> </programlisting> </example> <example> <title>静态方法示例</title> <programlisting role="php"> <![CDATA[ <?php class Foo { public static function aStaticMethod () { // ... } } Foo :: aStaticMethod (); $classname = 'Foo' ; $classname :: aStaticMethod (); // 自 PHP 5.3.0 起 ?>
class CeShi{ protected $name; //定义静态变量 static $num=100; public function tesst(){ echo $this->name; echo $this->$num;//不可以用 echo self::$num;//在类的内部访问静态变量使用关键字self后面跟上范围解析操作符(简称一对冒号) } } //在类的外部访问变量 echo CeShi::$num; //实例化对象 $cs=new CeShi(); $cs->tesst(); $cs->$NUM;//这样是不行的 $cs::$num; class CeShi{ protected $name; //在类中定义常量,使用关键字const const NUM=10; //定义静态变量 static $num=100; public function test(){ echo $this->name; // echo $this->NUM;//这样是不可以的 echo $this->$num;//不可以用 echo self::$num;//在类的内部访问静态变量使用关键字self后面跟上范围解析操作符(简称一对冒号) //在类的内部访问静态方法 // $this->test2();//方法中可以调用静态方法 self::test2();//方法中可以调用静态方法,标准写法 } public static function test2(){ //静态方法中不能使用$this //$this->name;//不能用 echo '调用了静态方法'; //静态中访问非静态方法是不行的,但可以访问静态静态属性和方法 } } //在类的外部访问变量 echo CeShi::$num; //实例化对象 $cs=new CeShi(); $cs->test(); //实例化对象访问常量 //$cs->$NUM;//这样是不行的 $cs::$num; //重新实例化对象,改变静态变量的值 //静态变量是全局变量,每个静态属性在内存中永远只会保存一个备份 $sc=new CeShi(); $sc::$num=500; echo $cs::$num;//500 echo $cs::$num;//500 //在类的外部访问静态方法 echo CeShi::test2(); echo $cs::test2(); echo $cs->test2();//不推荐的写法 //不实例化类直接进行访问
二、类中的常量定义修饰符
const是一个定义常量的关键字,在PHP中定义常量使用的是“define()”这个函数,但是在类里面定义常量使用的是“const”这个关键字,类似于C中的#define如果在程序中改变了它的值,那么会出现错误,用“const”修饰的成员属性的访问方式和“static”修饰的成员访问的方式差不多,也是使用“类名”,在方法里面使用“self”关键字。但是不用使用“$”符号,也不能使用对象来访问。
define('MYNUM',1000);//有三个参数,第三参数可以省略,表示区不区分大小写 //检测定义的常量是否存在使用defined echo MYNUM; //isset只能判断变量是否有值 //在类中定义常量 class CeShi{ protected $name; const NUM=10; public function tesst(){ echo $this->name; echo $this->NUM;//这样是不可以的 } } class CeShi{ protected $name; //在类中定义常量,使用关键字const const NUM=10; public function tesst(){ echo $this->name; // echo $this->NUM;//这样是不可以的 echo self::NUM;//在类的内部访问常量使用关键字self后面跟上范围解析操作符(简称一对冒号) } } //在类的外部访问常量 echo CeShi::NUM; //实例化对象 $cs=new CeShi(); $cs->tesst(); //实例化对象访问常量 $cs->NUM;//这样是不行的 $cs::NUM;