【问题标题】:PHP OOP - constant vs static variables?PHP OOP - 常量与静态变量?
【发布时间】:2011-05-09 00:24:40
【问题描述】:

在PHP中,有什么区别:

  1. 常量和静态变量?
  2. 扩展一个类并创建它的对象?

我知道它们可以如何使用,但我无法清楚地区分它们。

【问题讨论】:

  • 我会先参考 PHP 和 OO 文档,因为这些都是非常基本的问题。

标签: php inheritance constants static-variables


【解决方案1】:

常量变量对于每个对象都是独立的。 但是静态变量对于该类的所有对象都是通用的。 每个对象共享一个静态变量。 在类级别创建的静态变量。 在实例级别创建的常量变量。

【讨论】:

    【解决方案2】:

    一个重要的区别是内存分配。

    当创建类(对象)的实例时,会为新创建的对象分配内存。静态名称是根据内存分配的性质命名的。也就是说,静态对象的内存只分配一次,是静态的。当一个对象改变它的静态属性时,它会反映在同一个类的所有对象上。

    <?php
    class Test {
        static $test = "world!";
        static function hello() {
            echo "\nhello " . self::$test . "\n";
        }
    }
    
    $t = new Test();
    $x = new Test();
    
    $t->hello(); // prints 'hello world!'
    $t::$test = "Hmmm...";
    $t->hello(); // prints 'hello Hmmm...'
    $x->hello(); // prints 'hello Hmmm...'
    

    【讨论】:

      【解决方案3】:

      比较

      静态

      1. Can 有一个访问修饰符。

        class A{
            public static $public_static = "can access from anywhere";
            protected static $protected_static = "can access from inheriting classes";
            private static $private_static = "can access only inside the class";
        }
        
      2. 根据可见性,您可以访问静态变量。

        //inside the class
            self::$variable_name;
            static::$variable_name;
        //outside the class
            class_name::$variable_name;
        
      3. 声明后可以更改值。

            self::$variable_name = "New Value";
            static::$variable_name = "New Value";
        
      4. 声明时无需初始化。

            public static $variable_name; 
        
      5. 应用普通变量声明规则(例如:以$开头)

      6. 可以在函数内部创建。

            class A{
                function my_function(){
                     static $val = 12;
                     echo ++$val; //13
                }
            }
        

      常数

      1. 始终 public 不能放置访问修饰符。

        class A{
            const my_constant = "constant value";
            public const wrong_constant="wrong" // produce a parse error
        }
        
      2. 任何可以访问常量的地方。

        //inside the class
            self::variable_name;
            static::variable_name;
        //outside the class
            class_name::variable_name;
        
      3. 声明后无法更改值。

        self::variable_name = "cannot change"; //produce a parse error
        
      4. 声明时必须初始化。

        class A{
            const my_constant = "constant value";// Fine
            const wrong_constant;// produce a parse error
        }
        
      5. 不得在变量开头使用$(适用其他变量规则)。

         class A{
            const my_constant = "constant value";// Fine
            const $wrong_constant="wrong";// produce a parse error
        }
        
      6. 不能在函数内部声明。


      扩展时

          class A{
      
              public static $public_static = "can access from anywhere";
              protected static $protected_static = "can access from inheriting classes";
              private static $private_static = "can access only inside the class";
              
              const my_constant = "Constant value";
          }
      
          class B extends A{
      
              function output(){
      
                  // you can use self or static
      
                  echo self::$public_static; //can access from anywhere;
                  echo self::$protected_static; //can access from inheriting classes;
                  self::$protected_static = "Changed value from Class B";
                  echo self::$protected_static; //"Changed value from Class B";
                  
                  echo self::$private_static; //Produce Fatal Error
      
                  echo self::my_constant;//Constant value
              }
          }
      

      【讨论】:

      • 6.正在比较苹果和橙子,因为局部静态变量与静态(或常量)类属性不同。它们只存在于该函数/方法中。
      • 不能使用对象中的常量? (而不是来自班级)
      • 你不能访问类之外的常量
      • 请注意,从 PHP7.1 开始,常量允许使用访问修饰符,所以 可以 有:private const my_constant = "constant value";.
      【解决方案4】:

      您希望使用静态成员变量/函数的原因是您可以提取有关该类的信息,而无需创建它的实例(这会减少您的 CPU 开销)。

      【讨论】:

        【解决方案5】:

        Static 用于:

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

        因此,静态成员返回的值可能不同。例如,您可以根据传递给它的参数调用具有不同结果的静态方法。

        Constants值:

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

        所以,当你调用它时,它总是返回相同的结果

        关于创建一个对象和扩展一个类,当你“创建一个对象”时,你会创建一个a class 的实例。当您extend a class 时,您创建了另一个类:

        从父类继承所有公共和受保护的方法。除非类覆盖这些方法,否则它们将保留其原始功能。

        希望对你有帮助。

        【讨论】:

          【解决方案6】:

          常量变量是一个可以通过类名访问并且在脚本执行期间不能更改的变量。类静态变量也可以通过类名访问,但可以在程序执行期间更改。

          第二个问题 - 这些完全是其他问题。阅读有关面向对象编程的更多信息(不仅在 PHP 中)

          【讨论】:

            【解决方案7】:

            常量是常量,一旦赋值就不能改变它的值。另一方面,静态变量可以具有不同的值。例如,您可以在函数内部创建一个静态变量,以了解该函数被调用了多少次。每次调用函数时,该值都会更改,例如,如果您执行$i++,其中$istatic 变量。

            至于extending a class and creating its object,这就是所谓的继承,查看这篇文章了解更多:

            【讨论】:

              猜你喜欢
              • 2016-12-20
              • 2010-12-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-02
              相关资源
              最近更新 更多