"const" против "статического" в PHP

В PHP 5 я могу объявить const значение для класса:

class config
{
     const mailserver = 'mx.google.com';
}

Но я также могу объявить public static:

class config
{
     public static $mailserver = 'mx.google.com';
}

В случае файла конфигурации, который я буду использовать позже, например:

imap_connect(config::$mailserver ...
imap_connect(config::mailserver ...

Какой из вариантов, по вашему мнению, лучше использовать? (Быстрее, меньше загрузка памяти и т.д.)

Ответы

Ответ 1

Статическая переменная может быть изменена, const не может. Основное внимание следует уделить тому, чтобы переменные конфигурации могли быть изменены во время выполнения, а не быстрее. Разница в скорости между двумя (если она есть) настолько минимальна, что об этом не стоит думать.

Ответ 2

использовать функцию return global

0,006 0,005, 0,0056, 0,0054, 0,0072, 0,0063, 0,006, 0,0054, 0,0054, 0,0055, 0,005, 0,0057, 0,0053, 0,0049, 0,0064, 0,0054, 0,0053, 0,0053, 0,0061, 0,0059, 0,0076, config1

использовать экземпляр normal class

0,0101, 0,0089, 0,0105, 0,0088, 0,0107, 0,0083, 0,0094, 0,0081, 0,0106, 0,0093, 0,0098, 0,0092, 0,009, 0,0087, 0,0087, 0,0093, 0,0095, 0,0101, 0,0086, 0,0088, 0,0082, config2

использовать статический var

< 0,0029 0,003 0,003 0,0029 0,0029 0,0029 0,003 0,0029 0,003 0,0031 0,002 0,0031 0,0029 0,0029 0,0029 0,0029 0,0031 0,0029 0,0029 0,0029 0,0029 конфигураци 3/

использовать const var 0,0033, 0,0031, 0,0031, 0,0031, 0,0031, 0,0031, 0,0032, 0,0031, 0,0031, 0,0031, 0,0031, 0,0034, 0,0031, 0,0031, 0,0033, 0,0031, 0,0037, 0,0031, 0,0031, 0,0032, 0,0031, config4

function getTime() { 
    $timer = explode( ' ', microtime() ); 
    $timer = $timer[1] + $timer[0]; 
    return $timer; 
}

$config["time"] = "time";

class testconfig2
{
    public  $time = "time";
    static $instance;
    static function getInstance()
    {
        if(!isset(self::$instance))
            self::$instance = new testconfig2();
        return self::$instance;
    }
}

class testconfig3
{
    static $time = "time";
}

class testconfig4
{
    const time = "time";
}

function getConfig1()
{
    global $config;
    return $config;
}

$burncount = 2000;
$bcount = 22;

for($lcnt =1;$lcnt < $bcount;$lcnt++){
$start = getTime(); 
for($i=1;$i< $burncount;$i++)
{
    $gs=getConfig1();
    $t = $gs["time"];
} 
$end = getTime(); 
echo  round($end - $start,4).', ';
}
echo  ' config1<br/>';



for($lcnt =1;$lcnt < $bcount;$lcnt++){
$start = getTime(); 
for($i=1;$i< $burncount;$i++)
{
    $gs=testconfig2::getInstance();
    $t = $gs->time;
} 
$end = getTime(); 
echo  round($end - $start,4).', ';
}
echo  ' config2<br/>';



for($lcnt =1;$lcnt < $bcount;$lcnt++){
$start = getTime(); 
for($i=1;$i< $burncount;$i++)
{
    $gs=testconfig3::$time;
    $t = $gs;
} 
$end = getTime(); 
echo  round($end - $start,4).', ';
}
echo  ' config3<br/>';



for($lcnt =1;$lcnt < $bcount;$lcnt++){
$start = getTime(); 
for($i=1;$i< $burncount;$i++)
{
    $gs=testconfig4::time;
    $t = $gs;
} 
$end = getTime(); 
echo  round($end - $start,4).', ';
}
echo  ' config4<br/>';
?>

код >

Ответ 3

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

Ответ 4

Другое отличие между константой и static заключается в том, что некоторые переменные, такие как массивы, не допускаются в константах класса, поэтому

class mytest
{
    public static $c = array(1=> 'hello', 2=>'world');
}

работает, но

class mytest
{
    const c = array(1=> 'hello', 2=>'world');
}

не будет.

Ответ 5

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

Ответ 6

Оба "const" и "public static" являются злыми!

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

Это может показаться второстепенным, но это может быть следствием будущей катастрофы. Предположим, что я вынужден в будущем перейти к методу инициализации по какой-то непредвиденной причине. У меня нет проблем, если это означает, что я должен внести несколько изменений в файлы под моим контролем. Но что, если я изменю библиотеку, которую я отправил далеко вперед другим разработчикам?

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

Предполагая объектно-ориентированный код, я следую общим советам, которые я видел для многих языков, и требует дополнительного внимания для PHP - ИЗБЕГАЙТЕ ВИДИМОЙ СВОЙСТВА любого вида, будь то const, static или что-либо еще. Используйте методы "getter"!

Это может показаться смешным хитом производительности и уродливым стилем кода, но если вы не можете предсказать будущее, это единственный способ пойти.

Смотрите: Tjeerd Visser ответ на Как инициализировать статические переменные и дать ему удар. Игнорируйте его хулителей - если вы заинтересованы в производительности, над возможными ошибками и другими катастрофами, переключитесь на другой язык.