Php küresel bir değişken bildirmek için?


168

Ben böyle bir şey kodu var:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

global değişkeni tek bir yerde tanımlamanın ve değişkeni $aaynı anda tüm işlevlerde erişilebilir hale getirmenin bir yolu var mı? global $a;daha fazla kullanmadan ?


15
Hayır yok. globalAnahtar kelimeyi beğenmediyseniz, $GLOBALS['a']süper küresel olanı tüm kapsamlarda kullanmayı veya parametreyi işlevlerinize geçirmeyi düşünün.
Michael Berkowski

5
Önemli bir şeyse, bir oturum var bile kullanılabilir.
Nikos Tsirakis

Yanıtlar:


259

$GLOBALSDizi bunun yerine kullanılabilir:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

Gönderen Manuel :

Şu anda komut dosyasının global kapsamında tanımlanan tüm değişkenlere başvuru içeren ilişkilendirilebilir bir dizi. Değişken adları dizinin anahtarlarıdır.


Bazı ortak değişkenlere ihtiyaç duyan bir dizi işleviniz varsa, özellikleri olan bir sınıf genel yerine iyi bir seçim olabilir:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);

78

Değişken değişmeyecekse, define

Misal:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}

2
Değişiklik FOOTER_CONTENTyapılmaya çalışıldığında ne olur ? Sadece gibi mi finalJava veya constC, C ++ ve C #?
Lion

4
FOOTER_CONTENT'i ikinci kez tanımlamaya çalışırsanız, php bu konuda bir bildirim gönderir
Dale

Bir sayfa her yüklendiğinde geçerli unix dönemini hesaplamam gerekiyordu, sonra bu değeri birkaç hesaplamada (işlevler) kullanmalıydım. "define" benim için çalıştı. Başlangıçta, "echo FOOTER_CONTENT;" daha önce bir '$' yoktu ve hatalar aldım.
user208145

Değişken değişmeyecekse, değişken değildir. Öyle değil mi ?!
Sajidur Rahman

29

Değişkenlerinizi $ GLOBALS süper küresel diziye ekleyin

$GLOBALS['variable'] = 'localhost'; 

ve küresel olarak kullanın

veya betik boyunca erişilebilir olan sabiti kullanabilirsiniz

define('HOSTNAME', 'localhost');  

1
Eğer 'tanımla' kullanırsanız, ayarlandıktan sonra bir tanım değiştiremezsiniz!
Reza MA

ilk örneğinizde, komut dosyasında daha sonra '$ değişkenine' localhost 'deniyor mu?
Zach Smith

hayır bu değişkeni kullanmak isterseniz $ GLOBALS ['variable'] gibi kullanmalısınız;
Pankaj Khairnar

25

Bir değişken fonksiyon dışında bildirilirse, halihazırda global kapsamdadır. Yani beyan etmeye gerek yok. Ancak bu değişkeni çağırdığınız yerden bu değişkene erişimi olmalıdır. Bir fonksiyonun içinden arıyorsanız, globalanahtar kelime kullanmanız gerekir :

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Genel anahtar kelimenin bir işlev dışında kullanılması bir hata değildir. Bu dosyayı bir işlevin içine dahil etmek istiyorsanız, değişkeni olarak bildirebilirsiniz global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

Siz de kullanabilirsiniz $GLOBALS. Bir süper küresel olduğundan her yerden erişime sahiptir.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

Seçiminize bağlı olarak, ikisini de seçebilirsiniz.


9

Bu cevap çok geç ama yaptığım şey Booleans, diziler ve tamsayı başlangıç ​​değerlerini global kapsam statik değişkenleri olarak tutan bir sınıf ayarlamak. Sabit dizeler bu şekilde tanımlanır.

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

staticAnahtar kelimeler başka sınıfta bulunması gereken $ a, $ b vars ve $ c global kapsamlı edilmeyecektir.


Bu, birçok nedenden dolayı iyi bir çözümdür. Sınıf statik, temel değişken adına yalnızca birkaç karakter eklenmesini gerektirir: G :: $ Ad, bildirimin şöyle göründüğü yer: sınıf G {statik $ Ad, $ Ad2;} G'nin gerçekten global değişkenler olabileceğini unutmayın, E Çalışanlarla ilgili değişkenler için kullanılabilir. Bu, PHP ile desteklenen tam ölçekli nesne yönelimli paradigmadan daha kolay programlanabilir. Eğer sabitler gerçekten gerekliyse, "statik "ten sonra bildirilen değişkenler gibi" sabit "ten sonra bunları beyan edebilirsiniz - sadece dolar işaretlerini dışarıda bırakın. G :: Örnek küresel sabitin bir örneği olabilir.
David Spector

5

Bu soruyu yazdığınız şekilde cevapladınız - 'tanımla' kullanın. ancak ayarlandıktan sonra bir tanımı değiştiremezsiniz.

Alternatif olarak, sınıfta kullanabileceğiniz class :: constant gibi bir sabiti olan numaralar da vardır. Ayrıca, değiştirmek istediğinizde statik özelliği ayarlama işlevleriyle, sınıfa statik özellikler bildirerek bunları değişken hale getirebilirsiniz.


5

Anahtar kelimesini deneyebilirsiniz useiçinde Kapatma fonksiyonları veya Lambdas bu niyetinizi ... PHP 7.0 olsa uyuyor. Bu daha iyi değil, sadece bir alternatif.

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

demo | bilgi


1

Biraz farklı düşünelim:

class globe{
    static $foo = "bar";
}

Ve istediğiniz gibi kullanabilir ve değiştirebilirsiniz:

function func(){
    echo globe::$foo;
}

0

Değişken yerine yordamsal işlevden yararlanırsanız ve onları istediğiniz gibi çağırırsanız ne olur?

Genellikle yapılandırma değerlerinin bir koleksiyonunu oluşturur ve bunları return ifadesiyle bir işlevin içine yerleştiririm. Ben sadece küresel değeri kullanmak ve belirli bir işlev çağırmak için gereken yere dahil.

function host()
{
   return "localhost";
}

-1

$GLOBALS[] olduğu doğru çözüm, ama biz alternatifleri söz ediyoruz, çünkü bir işlev de kolayca bu işi yapabilirsiniz:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}

Burada işlev bir global değişken değildir.
Pratik Soni

@PratikSoni Hiç küresel bir değişken olduğunu söylemedim. Bir dahaki sefere daha iyi okuyun, bu şekilde olumsuz derecelendirmeleri her yere yaymazsınız.
Dario Ferrer

-19

Artık globalleri kullanmamalısınız, PHP 5.4'te mevcut değildir.


19
KAYIT KÜRESELLERİ kaldırıldı. küresel değil.
unity100

7
Bu cevap, yazıldığı gibi yanlıştır ve unity100'ün yorumunu yansıtacak şekilde güncellenmelidir. GLOBALS hala mevcutsa, lütfen GLOBAL değişkenlerinin hangi yönlerinin değiştiğini açıklığa kavuşturun. Böyle bir şey.
crashwap


@RobertColumbia Çok ilginç bir yazı, ve diğer cevaplar için akılda tutacağım, ancak bu özel durumda geçerli değildir. (Ben sadece bir cevap “bunu yapma” nasıl işaret etmek o metaetiketinin umuyorum olabilir ) "; geçerli değil bu biri olduğunu gerekçe olarak olun) 'Bunu yapma' olabilir , geçerli bir cevap . "- ' '' değil' dir olabilir. " Ama bazen, bunun yerine hiçbir şey yapılmasına gerek yok . Yanlış bir şey yapmayı bırakırsanız, her şey sihirli bir şekilde tekrar çalışmaya başlayacaktır. " - Kod "kırık" olmadığı için burada geçerli değildir. OP sadece bir şeyler yapmak için "daha az yazarak" bir yol istiyor. …
robinCTS

" aslında soruyu cevaplamaya mı çalışıyor? Çoğu durumda, " - "Çoğu", "hepsi" değil. ("En" ye bile itiraz ediyorum, ama bilinçli bir tartışma yapmak için yeterli cevap bulamadım.). “ Bu durumda öyle değil. ” - Ve bu “cevapta” aynı nedenlerle de değil: “ Daha da kötüsü, Murphy'nin cevabı soruna bir çözüm önermiyor. ” Ve “ Vermiyor Asker sorununa bir çözümü andıran bir araç veya yöntem ya da herhangi bir şey ". …
robinCTS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.