PHP ООП - константа против статических переменных? - PullRequest
6 голосов
/ 12 ноября 2010

В PHP, в чем разница между:

  1. Константы и статические переменные?
  2. Расширить класс и создать его объект?

Я знаю, как их можно использовать, но не могу четко различить их.

Ответы [ 7 ]

23 голосов
/ 10 сентября 2013

Сравнение

Статический

  1. Может иметь модификатор доступа.

    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. Всегда общедоступные не могут помещать модификаторы доступа.

    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
        }
    }
11 голосов
/ 12 ноября 2010

Статический предназначен для:

Свойства класса или методы как статические делают их доступными без необходимости создания экземпляра класса

Таким образом, значение, возвращаемое статическим членом, может отличаться. Например, вы можете вызвать статический метод с различным результатом в зависимости от того, какие параметры вы передаете ему.

Константы Значение:

должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызова функции.

Таким образом, он всегда возвращает один и тот же результат, когда вы вызываете его

О создании объекта и расширении класса, когда вы «создаете объект», вы создаете экземпляр класса . Когда вы расширяете класс , вы создаете другой класс, который:

наследует все открытые и защищенные методы от родительского класса. Если класс не переопределяет эти методы, они сохранят свою первоначальную функциональность.

Надеюсь, это поможет вам.

6 голосов
/ 12 ноября 2010

Константа является константой и НЕ может изменять свое значение после назначения.Статическая переменная, с другой стороны, может иметь различные значения.Например, вы можете создать статическую переменную внутри функции, чтобы узнать, сколько раз эта функция была вызвана.Значение будет изменяться каждый раз, когда вызывается функция, например, если вы делаете $i++, где $i - это static переменная.

Что касается extending a class and creating its object, это называется наследованием,проверить этот пост, чтобы узнать больше об этом:

1 голос
/ 01 октября 2013

Одно важное отличие заключается в распределении памяти.

Когда создается экземпляр класса (объекта), память выделяется для вновь созданного объекта. Имя static является после характера распределения памяти. То есть память для статических объектов выделяется только один раз, статически. Когда объект меняет свое статическое свойство, он отражается на всех объектах одного и того же класса.

<?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...'
1 голос
/ 12 ноября 2010

Переменная-константа - это переменная, к которой можно обращаться по имени класса, и которую НЕ МОГУТ изменить во время выполнения скрипта.Статическая переменная класса также может быть доступна по имени класса, но может быть изменена во время выполнения программы.

Второй вопрос - это ПОЛНОСТЬЮ другие вещи.Узнайте больше об объектно-ориентированном программировании (не только в PHP)

0 голосов
/ 21 мая 2014

Постоянные переменные являются отдельными для каждого объекта.Но статические переменные являются общими для всех объектов этого класса.Каждый объект имеет одну статическую переменную.Статическая переменная создана на уровне класса.Постоянная переменная создана на уровне экземпляра.

0 голосов
/ 24 декабря 2012

Причина, по которой вы хотите использовать статическую переменную / функцию-член, заключается в том, что вы можете извлекать информацию об этом классе, не создавая его экземпляра (что обойдется вам дешевле процессора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...