首页 > 代码库 > static关键字,const常量

static关键字,const常量

一、static关键字

这里说明了用 static 关键字来定义静态方法和属性。static 也可用于定义静态变量以及后期静态绑定。参见上述页面了解 static 在其中的用法。

static静态的,修饰类的属性方法,称静态资源

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。

就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 selfparent  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  .  "\n" ;

$foo  = new  Foo ();
print  $foo -> staticValue () .  "\n" ;
print  $foo -> my_static  .  "\n" ;       // Undefined "Property" my_static 

print  $foo :: $my_static  .  "\n" ;
$classname  =  ‘Foo‘ ;
print  $classname :: $my_static  .  "\n" ;  // As of PHP 5.3.0

print  Bar :: $my_static  .  "\n" ;
$bar  = new  Bar ();
print  $bar -> fooStatic () .  "\n" ;
?>
   </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;

 

static关键字,const常量