Размещено: 2023-12-13 15:31:19

Теги: php

КОНСТАНТЫ В PHP

Для работы с какими-то данными, которые не меняются в процессе работы нашего файла, и которые потребуется часто доставать в функциях, удобно использовать константы. Допустим мы работаем со сторонним API и есть ключи, либо id-пользователя либо еще что-то, что не меняется и часто указывается во всех функциях.

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

Константы в этом случае лучшее решение. Для задания константы можно использовать 2 способа: define или const, область видимости констант public, и они легко достаются в любой обычной функции.

//задаем значение константе NAME через define
define('NAME','stas');

//задаем значение константе NAME_1 через const
const NAME_1='ivan';

//выведем просто
echo NAME.'-----'.NAME_1.'<br>';

function names()
{
    //выведем внутри функции
    echo 'FUNCTION:'.NAME.'-----'.NAME_1.'<br>';
}

//не забудем её запустить
names();

Данный пример выведет:

stas-----ivan
FUNCTION:stas-----ivan

Проверка на существование константы и её значения

Что бы проверить на существование константу и её значение необходимо проверить 2 условия: что она задана, и что она не null. Проверить просто !CONST_TEST - не получится, в случае если её значение не задано она будет null, а в случае если она сама не задана, то её значение будет равно её имени CONST_TEST.

$s='texttest'; //если значения не будет то константа всеравно будет существовать, но со значением null 
define('CONST_TEST', $s); //если закомментировать define, то константа не будет задана, но всеравно её значение будет равно её имени

if(!defined('CONST_TEST') || CONST_TEST===NULL)
{
   echo '<log>error:CONST_TEST</log>';
   return false;
}

А если пытаться в константы пихать json, то еще и третья проверка нужна:

if(!defined('CONST_TEST') || CONST_TEST===NULL || CONST_TEST=='null'){return false;}

Выглядит конечно ужасно, но это точно работает.

Функция для проверки существования константы и существования её значения

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

function check_const($name)
{
    if(!defined($name) || constant($name)===NULL || constant($name)=='null')
    {
        return false;
    }
    return true;
}

//$s=array("a"=>12345,"b"=>65432);

define('CONST_TEST', json_encode($s));

if(check_const('CONST_TEST')===true)
{
    echo 'yes';
}
else
{
    echo 'no';
}

Разница между define() и const

const должны быть объявлены в верхней области. Это значит, что const нельзя использовать внутри функций/циклов/выражений if или try/catch блоков.

if ( 1 ) {
  const NAME = 'VALUE';  // не работает
}
// но
if ( 1 ) {
  define( 'NAME', 'VALUE' );  // работает
}

Что с массивами?

А с массивами тут полная шляпа. На старых версиях php, ниже 7, константы не могут задаваться в виде массивов. Ну и что тогда делать? Тогда либо serialize-unserialize, либо json_encode-json_decode. И для надежности и понятности наверно стоит json'ом даже на более новых версиях пользоваться, если скрипт планируется использовать где-то еще где стоит старая версия. Это кросс-версионное решение:

//есть какой-то массив
$array=array("a"=>"php","b"=>"js","c"=>"mysql");

//помещаем в константу в виде JSON строки
define('ARR',json_encode($array));

//выводим из константы назад в массив
print_r(json_decode(ARR, true));


/*
выводит:

Array
(
    [a] => php
    [b] => js
    [c] => mysql
)
*/

Как указать константу в mysql_query?

Тут все достаточно просто.

define('CONST_NAME','test_text');
$q=mysql_fetch_assoc(mysql_query(" SELECT * FROM `table1` WHERE `name`='".CONST_NAME."' "));

На эту страницу чаще всего попадают по запросам: константа, задать константу, const, define, глобальная, область видимости переменной, global