【问题标题】:PHP 5: const vs staticPHP 5:常量与静态
【发布时间】:2010-12-13 17:50:10
【问题描述】:

在 PHP 5 中,使用 conststatic 有什么区别?

什么时候合适? publicprotectedprivate 扮演什么角色 - 如果有的话?

【问题讨论】:

    标签: php object constants class-design static-members


    【解决方案1】:

    在类的上下文中,静态变量位于类范围(而不是对象)范围内,但与 const 不同的是,它们的值可以更改。

    class ClassName {
        static $my_var = 10;  /* defaults to public unless otherwise specified */
        const MY_CONST = 5;
    }
    echo ClassName::$my_var;   // returns 10
    echo ClassName::MY_CONST;  // returns 5
    ClassName::$my_var = 20;   // now equals 20
    ClassName::MY_CONST = 20;  // error! won't work.
    

    public、protected 和 private 与 const 无关(它们始终是公共的);它们只对类变量有用,包括静态变量。

    • 可以通过 ClassName::$variable 在任何地方访问公共静态变量。
    • 受保护的静态变量可以由定义类或扩展类通过 ClassName::$variable 访问。
    • 私有静态变量只能由定义类通过 ClassName::$variable 访问。

    编辑:重要的是要注意PHP 7.1.0 introduced support for specifying the visibility of class constants

    【讨论】:

    • 我更喜欢将 self::$variable 用于受保护的静态变量和私有静态变量,因为我更喜欢在类的开头只提及一次类名。
    • 是的,好点,我忘了提到如果从类本身引用,可以使用 self 关键字。我上面提供的示例是在类定义之外执行的,在这种情况下必须使用类名。
    • 很好的答案,非常接近接受。您能否澄清一点:“公共、受保护和私有在 const 方面无关紧要” - 为什么?默认情况下 const 都是公开的吗?都是私人的?
    • 静态变量不需要$ 吗?定义中的static $my_var = 10;
    • 旧线程,但我想补充一点:查看php.net/manual/en/…,它解释了static 变量在单例和递归函数中也非常有用。因为您可以更改值,但变量只会被初始化一次。请参阅stackoverflow.com/questions/203336/… 以进一步说明如何创建单例。对我来说,这些是我更喜欢静态变量的情况。
    【解决方案2】:

    将类方法或属性声明为静态使它们无需实例化即可访问。

    类常量就像一个普通的常量,它不能在运行时改变。这也是你将永远使用 const 的唯一原因。

    Private、public 和 protected 是访问修饰符,描述谁可以访问哪个参数/方法。

    公共意味着所有其他对象都可以访问。 私有意味着只有实例化的类才能访问。 受保护意味着实例化的类和派生类可以访问。

    【讨论】:

      【解决方案3】:

      Constant 只是一个常量,即声明后不能更改它的值。

      静态变量无需创建类实例即可访问,因此可在类的所有实例之间共享。

      此外,函数中可以有一个静态局部变量,它只声明一次(在函数的第一次执行时),并且可以在函数调用之间存储其值,例如:

      function foo()
      {
         static $numOfCalls = 0;
         $numOfCalls++;
         print("this function has been executed " . $numOfCalls . " times");
      }
      

      【讨论】:

        【解决方案4】:

        最后一点应该说明的是 const 始终是静态的和公共的。这意味着您可以像这样从类中访问 c​​onst:

        class MyClass
        {
             const MYCONST = true;
             public function test()
             {
                  echo self::MYCONST;
             }
        }
        

        你可以像这样从课堂之外访问它:

        echo MyClass::MYCONST;
        

        【讨论】:

        • 这个声明是真的吗? “const 始终是静态的和公开的”?
        • 这不再是真的。自 PHP 7.1 起,类常量可以声明为私有或受保护。见RFC
        【解决方案5】:

        所以回顾一下@Matt 的好答案:

        • 如果你需要的属性不应该改变,那么常量是正确的选择

        • 如果你需要的属性允许更改,请改用静态

        例子:

        class User{
            private static $PASSWORD_SALT = "ASD!@~#asd1";
            ...
        }
        
        class Product{
            const INTEREST = 0.10;
            ...
        }
        

        编辑:重要的是要注意PHP 7.1.0 introduced support for specifying the visibility of class constants

        【讨论】:

          【解决方案6】:

          在谈论类继承时,您可以使用selfstatic 关键字来区分不同范围内的常量或变量。查看此示例,该示例说明了如何访问内容:

          class Person
          {
              static $type = 'person';
          
              const TYPE = 'person';
          
              static public function getType(){
                  var_dump(self::TYPE);
                  var_dump(static::TYPE);
          
                  var_dump(self::$type);
                  var_dump(static::$type);
              }
          }
          
          class Pirate extends Person
          {
              static $type = 'pirate';
          
              const TYPE = 'pirate';
          }
          

          然后做:

          $pirate = new Pirate();
          $pirate::getType();
          

          或:

          Pirate::getType();
          

          输出:

          string(6) "person" 
          string(6) "pirate" 
          string(6) "person" 
          string(6) "pirate"
          

          换句话说,self:: 指的是静态属性和常量,来自它被调用的同一范围(在本例中为Person 超类),而static:: 将在运行时(所以在这种情况下在 Pirate 子类中)。

          阅读更多on late static binding here on php.net.
          还要检查另一个问题herehere 的答案。

          【讨论】:

            【解决方案7】:

            这是我迄今为止学到的关于静态成员、常量变量和访问修饰符(私有、公共和受保护)的内容。 常数

            定义

            顾名思义,常量变量的值不能更改。常量与普通变量的不同之处在于您不使用 $ 符号来声明或使用它们。

            值必须是常量表达式,而不是(例如)变量、属性、数学运算的结果或函数调用。

            注意:变量的值不能是关键字(例如 self、parent 和静态)。

            在php中声明一个常量

            <?php
            class constantExample{
            
               const CONSTANT = 'constant value'; //constant
            
             }
            ?>
            

            Constant 的作用域是全局的,可以使用 self 关键字访问

            <?php
            class MyClass
            {
                const CONSTANT = 'constant value';
            
                function showConstant() {
                    echo  self::CONSTANT . "\n";
                }
            }
            
            echo MyClass::CONSTANT . "\n";
            
            $classname = "MyClass";
            echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0
            
            $class = new MyClass();
            $class->showConstant();
            
            echo $class::CONSTANT."\n"; // As of PHP 5.3.0
            
            ?>
            

            静态

            定义

            静态关键字可用于声明类、成员函数或变量。类中的静态成员是全局的,也可以使用 self 关键字访问。将类属性或方法声明为静态使它们无需实例化即可访问类的。声明为静态的属性不能用实例化的类对象访问(尽管静态方法可以)。如果没有使用可见性声明(public、private、protected),则属性或方法将被视为已声明为 public。因为静态方法无需创建对象实例即可调用。

            注意:伪变量 $this 在方法中不可用 声明为 static.Static 属性不能通过 使用箭头运算符的对象 ->

            从 PHP 5.3.0 开始,可以使用变量来引用类。 >变量的值不能是关键字(例如 self、parent 和 static)。

            静态属性示例

            <?php
            class Foo
            {
                public static $my_static = 'foo'; //static variable 
            
                public static function staticValue() { //static function example
                    return self::$my_static;  //return the static variable declared globally
                }
            }
            
            ?>
            

            访问静态属性和函数示例

             <?php
                 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";
            
             ?>
            

            Public、private、protected(A.K.A 访问修饰符)

            在阅读下面的定义之前,请阅读这篇关于封装的文章。它将帮助您更深入地理解这个概念

            Link 1 wikipedia

            Tutorials point link about encapsulation

            定义

            使用 private 、 public 、 protected 关键字,您可以控制对类中成员的访问。声明为 public 的类成员可以在任何地方访问。声明为 protected 的成员只能在类本身内以及被继承类和父类访问。声明为私有的成员只能由定义该成员的类访问。

            示例

             <?php 
            class Example{
             public $variable = 'value'; // variable declared as public 
             protected $variable = 'value' //variable declared as protected
             private $variable = 'value'  //variable declared as private
            
             public function functionName() {  //public function
             //statements
             }
            
             protected function functionName() {  //protected function
             //statements
             }
              private function functionName() {  //private function
               //statements
               }
            
            } 
             ?> 
            

            访问公共、私有和受保护成员示例

            可以从类外部访问和修改公共变量 或在课堂内。但是您只能从类内部访问私有和受保护的变量和函数,您不能在类外修改受保护或公共成员的值。

              <?php 
              class Example{
                public $pbVariable = 'value'; 
                protected $protVariable = 'value'; 
                private $privVariable = 'value';
                public function publicFun(){
            
                 echo $this->$pbVariable;  //public variable 
                 echo $this->$protVariable;  //protected variable
                 echo $this->privVariable; //private variable
                }
            
               private function PrivateFun(){
            
             //some statements
              }
              protected function ProtectedFun(){
            
             //some statements
              }
            
              }
            
            
             $inst = new Example();
             $inst->pbVariable = 'AnotherVariable'; //public variable modifed from outside
             echo $inst->pbVariable;   //print the value of the public variable
            
             $inst->protVariable = 'var'; //you can't do this with protected variable
             echo $inst->privVariable; // This statement won't work , because variable is limited to private
            
             $inst->publicFun(); // this will print the values inside the function, Because the function is declared as a public function
            
             $inst->PrivateFun();   //this one won't work (private)
             $inst->ProtectedFun();  //this one won't work as well (protected)
            
              ?>
            

            有关更多信息,请阅读有关可见性Visibility Php Doc 的 php 文档

            参考资料:php.net

            我希望你理解这个概念。感谢阅读 :) :) 祝你好运

            【讨论】:

              猜你喜欢
              • 2011-05-09
              • 1970-01-01
              • 2014-07-02
              • 2013-04-16
              • 2010-10-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多