PHP statik vs const [yinelenen]

6 Cevap php

Bu soru burada zaten bir cevabı var:

6 Cevap

Statik değişken, tek yapamam const değiştirilebilir. Ana düşünce yapılandırma değişkenleri hızlı olduğu, çalışma zamanında değil değişmiş olması gerekir olup olmadığını verilmelidir. Iki (eğer varsa) arasındaki hız farkı düşünmeye değer değil yani az.

Küresel dönmek işlevini kullanın

0,0096, 0,0053, 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

Örneğin normal bir sınıf almak kullanmak

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

statik var kullanmak

0.0029, 0.003, 0.003, 0.0029, 0.0029, 0.0029, 0.003, 0.0029, 0.003, 0.0031, 0.0032, 0.0031, 0.0029, 0.0029, 0.0029, 0.0029, 0.0031, 0.0029, 0.0029, 0.0029, 0.0029, config3

use 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/>';
?>

Statik değişkenler izin verilmez varsayılan fonksiyonu argüman değerleri için sabitleri kullanabilirsiniz.

Kat ve statik arasındaki bir diğer fark, diziler gibi bazı değişkenler, böylece sınıf sabitleri izin verilmez olmasıdır

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

çalışır, ancak

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

olmaz.

Ayrıca çünkü Yacoby yukarıda söyledikleri, size, bir YILI yapmak, örneğin değişken bir çalışma zamanı yöntem çağrısı sonucu atamak değil, statik bir değişken ile yapabileceğiniz bazı şeyler vardır unutmayın.

Her ikisi de 'const' ve 'statik public' kötülük vardır!

Keith Humm belirtildiği gibi - const bir çalışma zamanı yöntemi sonucu olamaz. Ben başlangıçta ona "(statik) değişkene bir çalışma zamanı yöntem çağrısı sonucu atamak" söyleyerek doğru olduğunu düşündüm rağmen, benim test bunu yapmak için bazı çemberler üzerinden atlamak zorunda gösteriyor.

Bu küçük bir nokta gibi görünebilir, ama gelecekteki bir felaketin tohumu olabilir. Ben gelecekte bazı öngörülemeyen bir nedenle bir başlatma yöntemine geçmek zorunda ediyorum varsayalım. Bu benim kontrol altında dosyalarında birkaç değişiklik yapmak zorunda kalıyoruz eğer sorunum yok. Ama, ne ben diğer geliştiricilere çok geniş ve gönderdiğiniz adres kütüphane değiştirirseniz?

Ben en azından, o yazmak için gidiyordu, ben onlar benim yeni sürüme yükseltmek istiyorsanız ONLARIN dosyalarında değişiklik yapmak için başka (ve 'Geleceğin Me') herkese anlatmak zorunda. 'Const' durumunda, her yerde onlar bunu kullanmak bir '$' eklemek zorunda olacak. Diğer senaryolarda, benim test bugün onlar daha az yapmak zorunda kalabilirsiniz gösterir, ancak bazı değişiklikler.

Nesne yönelimli kod varsayarsak, ben birçok dilde görülen, ve PHP için ekstra önem ihtiyacı var genel tavsiye izleyin - Her türlü görünür özellikleri KAÇININ const, statik ya da başka bir şey olsun. 'Alıcı' yöntemlerini kullanın!

Bu saçma bir performans isabet ve çirkin kod tarzı gibi görünebilir, ancak geleceği tahmin sürece, o gitmek için tek yoldur.

PHP: How to initialize static variables için Tjeerd Visser cevabı ve bir yumru vermek: Bkz. Onun iftiralarını görmezden - olası böcek ve diğer afetler yukarıda performansı ile ilgili, daha sonra başka bir dile geçmek olduğunu eğer.