10

在 PHP 中,有什么区别:

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

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

4

7 回答 7

29

比较

静止的

  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. Always public 不能放置访问修饰符(>PHP7.1)

    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
        }
    }
于 2013-09-10T10:20:14.883 回答
12

静态 适用于:

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

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

量值:

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

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

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

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

我希望它对你有帮助。

于 2010-11-12T11:15:44.643 回答
6

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

至于extending a class and creating its object,这称为继承,请查看此帖子以了解更多信息:

于 2010-11-12T11:09:25.440 回答
3

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

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

<?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...'
于 2013-10-01T11:42:08.003 回答
1

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

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

于 2010-11-12T11:10:05.160 回答
0

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

于 2012-12-23T20:00:23.520 回答
-1

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

于 2014-05-21T05:34:34.473 回答