• 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  .  "
    " ;
    
    $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;
  • 相关阅读:
    strtok和strtok_r
    几种更新(Update语句)查询的方法
    常见的几种RuntimeException
    初识ASP.NET---若干常见错误
    Microsoft.AlphaImageLoader滤镜解说
    情绪管理--不要总做“好脾气”的人。
    Linux中搭建SVNserver
    Java虚拟机的启动与程序的执行
    Ubuntu下deb包的安装方法
    財哥面京东dm的经历【帮財哥发的】
  • 原文地址:https://www.cnblogs.com/chenduzizhong/p/7207462.html
Copyright © 2020-2023  润新知