Bagaimana cara mendeklarasikan variabel global dalam php?

168

Saya punya kode seperti ini:

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

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

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

apakah ada cara untuk mendefinisikan variabel global di satu tempat dan membuat variabel $adapat diakses di semua fungsi sekaligus? tanpa memanfaatkan global $a;lebih banyak?

CAHAYA
sumber
15
Tidak ada. Jika Anda tidak menyukai globalkata kunci, pertimbangkan untuk menggunakan $GLOBALS['a']superglobal di semua lingkup, atau pertimbangkan untuk meneruskan parameter ke fungsi Anda.
Michael Berkowski
5
Jika itu sesuatu yang penting maka bahkan sesi var dapat digunakan.
Nikos Tsirakis

Jawaban:

259

The $GLOBALSarray dapat digunakan sebagai pengganti:

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

function body(){

    echo $GLOBALS['a'];
}

Dari Manual :

Array asosiatif yang berisi referensi ke semua variabel yang saat ini didefinisikan dalam lingkup global skrip. Nama-nama variabel adalah kunci dari array.


Jika Anda memiliki serangkaian fungsi yang memerlukan beberapa variabel umum, kelas dengan properti mungkin merupakan pilihan yang baik alih-alih global:

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);
MrCode
sumber
78

Jika variabel tidak akan berubah, Anda dapat menggunakan define

Contoh:

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

function footer()
{
    echo FOOTER_CONTENT;
}
Lembah
sumber
2
Apa yang terjadi ketika FOOTER_CONTENTdicoba untuk dimodifikasi? Apakah itu seperti finaldi Jawa atau constdi C, C ++ dan C #?
Singa
4
Jika Anda mencoba mendefinisikan FOOTER_CONTENT untuk kedua kalinya, php akan memberikan pemberitahuan tentang hal itu
Dale
Saya perlu menghitung waktu unix saat ini setiap kali halaman dimuat, kemudian gunakan nilai itu dalam beberapa perhitungan (fungsi). "define" bekerja untuk saya. Awalnya, saya tidak melihat "echo FOOTER_CONTENT;" tidak memiliki '$' sebelumnya dan saya mendapat kesalahan.
user208145
Jika variabel tidak akan berubah, itu bukan variabel. Bukan ?!
Sajidur Rahman
29

Tambahkan variabel Anda di $ GLOBALS seperti super global array

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

dan menggunakannya secara global

atau Anda dapat menggunakan konstanta yang dapat diakses di seluruh skrip

define('HOSTNAME', 'localhost');  
Pankaj Khairnar
sumber
1
Jika Anda menggunakan 'define', setelah diset, Anda tidak dapat mengubah define!
Reza MA
pada contoh pertama Anda, apakah dikatakan '$ variable sekarang disebut' localhost 'nanti dalam skrip?
Zach Smith
tidak jika Anda ingin menggunakan variabel ini, Anda harus menggunakannya seperti $ GLOBALS ['variable'];
Pankaj Khairnar
25

Jika suatu variabel dideklarasikan di luar fungsi, ia sudah ada dalam lingkup global. Jadi tidak perlu mendeklarasikan. Tetapi dari tempat Anda memanggil variabel ini harus memiliki akses ke variabel ini. Jika Anda menelepon dari dalam suatu fungsi, Anda harus menggunakan globalkata kunci:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Menggunakan kata kunci global di luar fungsi bukanlah kesalahan. Jika Anda ingin memasukkan file ini ke dalam suatu fungsi, Anda dapat mendeklarasikan variabel sebagai global.

config.php

global $variable;

$variable = 5;

other.php

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

Anda bisa menggunakannya $GLOBALSjuga. Ini superglobal sehingga memiliki akses di mana-mana.

$GLOBALS['variable'] = 5;

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

Tergantung pada pilihan Anda, Anda dapat memilih salah satu.

Sajidur Rahman
sumber
9

Jawaban ini sangat terlambat tetapi apa yang saya lakukan adalah mengatur kelas yang menampung Boolean, array, dan nilai integer-initial sebagai variabel statis lingkup global. Setiap string konstan didefinisikan seperti itu.

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

Kata statickunci harus ada di kelas lain vars $ a, $ b, dan $ c tidak akan dicakup secara global.

Satu-Satunya ChemistryBlob
sumber
Ini adalah solusi yang bagus karena berbagai alasan. Statis kelas hanya membutuhkan beberapa karakter yang ditambahkan ke nama variabel dasar: G :: $ Name, di mana deklarasi terlihat seperti ini: kelas G {static $ Name, $ Name2;} Perhatikan bahwa G dapat benar-benar variabel global, maka E dapat digunakan untuk variabel yang berkaitan dengan Karyawan. Ini lebih mudah diprogram dengan daripada paradigma berorientasi objek skala penuh yang didukung oleh PHP. Jika konstanta benar-benar diperlukan, Anda dapat mendeklarasikannya setelah "const" sama seperti variabel yang dideklarasikan setelah "statis" - tinggalkan saja tanda-tanda dolar. G :: Contoh akan menjadi contoh dari konstanta global.
David Spector
5

Anda menjawab ini dengan cara Anda menulis pertanyaan - gunakan 'define'. tetapi begitu diatur, Anda tidak dapat mengubah suatu definisi.

Atau, ada trik dengan konstanta di kelas, seperti class :: konstanta yang dapat Anda gunakan. Anda juga bisa membuatnya variabel dengan mendeklarasikan properti statis ke kelas, dengan fungsi untuk mengatur properti statis jika Anda ingin mengubahnya.

Robbie
sumber
5

Anda dapat mencoba kata kunci usedalam fungsi Penutupan atau Lambdas jika ini sesuai dengan keinginan Anda ... PHP 7.0. Bukan itu lebih baik, tetapi hanya sebuah alternatif.

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

demo | info

Sangat berbahaya
sumber
1

Mari kita berpikir sedikit berbeda:

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

Dan Anda dapat menggunakan dan memodifikasinya kapan saja Anda suka, seperti:

function func(){
    echo globe::$foo;
}
Amir Fo
sumber
0

Bagaimana jika Anda menggunakan fungsi prosedural alih-alih variabel dan memanggil mereka di mana saja seperti Anda.

Saya biasanya membuat koleksi nilai konfigurasi dan meletakkannya di dalam fungsi dengan pernyataan kembali. Saya hanya memasukkan bahwa di mana saya perlu menggunakan nilai global dan memanggil fungsi tertentu.

function host()
{
   return "localhost";
}
Veshraj Joshi
sumber
0

$GLOBALS[] adalah solusi yang tepat, tetapi karena kita berbicara tentang alternatif, suatu fungsi juga dapat melakukan pekerjaan ini dengan mudah:

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

function my_var() {
    return 'Rome';
}
Dario Ferrer
sumber
-19

Anda seharusnya tidak menggunakan global lagi, mereka tidak tersedia dalam PHP 5.4.

Daniel West
sumber
19
REGISTER GLOBALS dihapus. bukan global.
unity100
7
Jawaban ini, seperti yang ditulis, salah dan harus diperbarui untuk mencerminkan komentar unity100. Jika GLOBAL masih tersedia, harap jelaskan aspek vars GLOBAL apa yang telah berubah. Sesuatu seperti ini.
crashwap
@RobertColumbia Posting yang sangat menarik, dan saya akan mengingatnya untuk jawaban lain, tetapi, itu tidak berlaku dalam kasus khusus ini. (Saya harap Anda hanya menggunakan meta itu untuk menunjukkan bagaimana jawaban "jangan lakukan itu" mungkin valid dan bukan sebagai pembenaran bahwa ini adalah;)) " " Jangan lakukan itu " bisa menjadi jawaban yang valid . "- 'bisa' tidak 'adalah'. " Tapi kadang-kadang, tidak ada yang perlu dilakukan sebagai gantinya. Jika Anda hanya berhenti melakukan hal yang salah, semuanya akan mulai bekerja secara ajaib. " - Tidak berlaku di sini karena kode tidak "rusak". OP hanya menginginkan cara "mengetik kurang" dalam melakukan sesuatu. ...
robinCTS
"Apakah ini benar-benar berusaha menjawab pertanyaan? Dalam kebanyakan kasus, itu. " - "Kebanyakan", bukan "semua". (Saya bahkan akan membantah yang "paling", tapi saya belum melihat cukup jawaban seperti itu untuk membuat argumen.). " Dalam hal ini, tidak. " - Dan dalam "jawaban" ini tidak juga, karena alasan yang sama: " Lebih buruk, jawaban Murphy tidak mengusulkan solusi untuk masalah ini. " Dan " Itu tidak memberikan penanya alat atau metode atau apa pun yang menyerupai solusi untuk masalahnya ". ...
robinCTS