Поиск…


Синтаксис

  • define (string $ name, mixed $ value [, bool $ case_insensitive = false])
  • const CONSTANT_NAME = VALUE;

замечания

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

Константы имеют такие типы, как переменные, но не все типы могут использоваться для инициализации константы. Объекты и ресурсы не могут использоваться как значения для констант вообще. Массивы могут использоваться как константы, начиная с PHP 5.6

Некоторые постоянные имена зарезервированы PHP. К ним относятся true , false , null а также многие константы, специфичные для модуля.

Константы обычно называются с использованием прописных букв.

Проверка константы

Простая проверка

Чтобы проверить, определена ли константа, используйте defined функцию. Обратите внимание, что эта функция не заботится о значении константы, она заботится только о том, существует ли константа или нет. Даже если значение константы равно null или false функция все равно вернет true .

<?php

define("GOOD", false);

if (defined("GOOD")) {
    print "GOOD is defined" ; // prints "GOOD is defined"

    if (GOOD) {
        print "GOOD is true" ; // does not print anything, since GOOD is false
    }
}

if (!defined("AWESOME")) {
   define("AWESOME", true); // awesome was not defined. Now we have defined it 
}

Обратите внимание, что константа становится «видимой» в вашем коде только после строки, в которой вы ее определили:

<?php

if (defined("GOOD")) {
   print "GOOD is defined"; // doesn't print anyhting, GOOD is not defined yet.
}

define("GOOD", false);

if (defined("GOOD")) {
   print "GOOD is defined"; // prints "GOOD is defined"
}

Получение всех определенных констант

Чтобы получить все определенные константы, в том числе созданные PHP, используйте функцию get_defined_constants :

<?php

$constants = get_defined_constants();
var_dump($constants); // pretty large list

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

<?php

$constants = get_defined_constants();

define("HELLO", "hello"); 
define("WORLD", "world"); 

$new_constants = get_defined_constants();

$myconstants = array_diff_assoc($new_constants, $constants);
var_export($myconstants); 
   
/* 
Output:

array (
  'HELLO' => 'hello',
  'WORLD' => 'world',
) 
*/

Иногда это полезно для отладки

Определение констант

Константы создаются с помощью инструкции const или функции define . Соглашением является использование букв UPPERCASE для постоянных имен.

Определить константу с использованием явных значений

const PI = 3.14; // float
define("EARTH_IS_FLAT", false); // boolean
const "UNKNOWN" = null; // null
define("APP_ENV", "dev"); // string
const MAX_SESSION_TIME = 60 * 60; // integer, using (scalar) expressions is ok

const APP_LANGUAGES = ["de", "en"]; // arrays


define("BETTER_APP_LANGUAGES", ["lu", "de"]); // arrays

Определить константу с использованием другой константы

если у вас есть одна константа, вы можете определить другую на основе этого:

const TAU = PI * 2;
define("EARTH_IS_ROUND", !EARTH_IS_FLAT);
define("MORE_UNKNOWN", UNKNOWN);
define("APP_ENV_UPPERCASE", strtoupper(APP_ENV)); // string manipulation is ok too
// the above example (a function call) does not work with const:
// const TIME = time(); # fails with a fatal error! Not a constant scalar expression
define("MAX_SESSION_TIME_IN_MINUTES", MAX_SESSION_TIME / 60);

const APP_FUTURE_LANGUAGES = [-1 => "es"] + APP_LANGUAGES; // array manipulations


define("APP_BETTER_FUTURE_LANGUAGES", array_merge(["fr"], APP_BETTER_LANGUAGES));

Зарезервированные константы

Некоторые константные имена зарезервированы PHP и не могут быть переопределены. Все эти примеры потерпят неудачу:

define("true", false); // internal constant
define("false", true); // internal constant
define("CURLOPT_AUTOREFERER", "something"); // will fail if curl extension is loaded

И выдается Уведомление:

Constant ... already defined in ...

Условные определения

Если у вас есть несколько файлов, где вы можете определить одну и ту же переменную (например, вашу основную конфигурацию, а затем локальную конфигурацию), следующий синтаксис может помочь избежать конфликтов:

defined("PI") || define("PI", 3.1415); // "define PI if it's not yet defined"

const vs define

define - это выражение времени выполнения, а const - время компиляции.

Таким образом, define позволяет использовать динамические значения (т. Е. Вызовы функций, переменные и т. Д.) И даже динамические имена и условное определение. Тем не менее он всегда определяет относительно корневого пространства имен.

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

const поддерживает только другие константы и скаляры как значения, а не операции.

Константы классов

Константы могут быть определены внутри классов с использованием ключевого слова const .

class Foo {
    const BAR_TYPE = "bar";

    // reference from inside the class using self::
    public function myMethod() {
        return self::BAR_TYPE;
    }
}

// reference from outside the class using <ClassName>::
echo Foo::BAR_TYPE;

Это полезно для хранения типов предметов.

<?php

class Logger {
    const LEVEL_INFO = 1;
    const LEVEL_WARNING = 2;
    const LEVEL_ERROR = 3;

    // we can even assign the constant as a default value
    public function log($message, $level = self::LEVEL_INFO) {
        echo "Message level " . $level . ": " . $message;
    }
}

$logger = new Logger();
$logger->log("Info"); // Using default value
$logger->log("Warning", $logger::LEVEL_WARNING); // Using var
$logger->log("Error", Logger::LEVEL_ERROR); // using class

Постоянные массивы

Массивы могут использоваться как простые константы и константы класса из версии PHP 5.6 и далее:

Пример константы класса

class Answer {
    const C = [2,4];
}

print Answer::C[1] . Answer::C[0]; // 42

Пример простой константы

const ANSWER = [2,4];
print ANSWER[1] . ANSWER[0]; // 42

Также из версии PHP 7.0 эта функция была перенесена на функцию define для простых констант.

define('VALUES', [2, 3]);
define('MY_ARRAY', [
    1,
    VALUES,
]);

print MY_ARRAY[1][1]; // 3

Использование констант

Чтобы использовать константу, просто используйте ее имя:

if (EARTH_IS_FLAT) {
    print "Earth is flat";
}

print APP_ENV_UPPERCASE;

или если вы заранее не знаете имя константы, используйте constant функцию:

// this code is equivalent to the above code
$const1 = "EARTH_IS_FLAT";
$const2 = "APP_ENV_UPPERCASE";

if (constant($const1)) {
    print "Earth is flat";
}

print constant($const2);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow