วิธีการประกาศตัวแปรทั่วโลกใน PHP?


168

ฉันมีรหัสดังนี้:

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

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

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

มีวิธีการกำหนดตัวแปรทั่วโลกในที่เดียวและทำให้ตัวแปร$aสามารถเข้าถึงได้ในฟังก์ชั่นทั้งหมดในครั้งเดียว? โดยไม่ต้องใช้ประโยชน์global $a;เพิ่มเติม?


15
ไม่มีเลย หากคุณไม่ชอบglobalคำหลักให้พิจารณาใช้$GLOBALS['a']superglobal ในขอบเขตทั้งหมดหรือพิจารณาส่งพารามิเตอร์ไปยังฟังก์ชันของคุณ
Michael Berkowski

5
หากเป็นสิ่งที่สำคัญคุณสามารถใช้ var แม้แต่เซสชันได้
Nikos Tsirakis

คำตอบ:


259

$GLOBALSอาร์เรย์สามารถนำมาใช้แทน:

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

function body(){

    echo $GLOBALS['a'];
}

จากคู่มือ :

อาร์เรย์ที่เชื่อมโยงซึ่งมีการอ้างอิงถึงตัวแปรทั้งหมดที่กำหนดไว้ในขอบเขตส่วนกลางของสคริปต์ในปัจจุบัน ชื่อตัวแปรคือกุญแจของอาร์เรย์


หากคุณมีชุดฟังก์ชันที่ต้องการตัวแปรทั่วไปคลาสที่มีคุณสมบัติอาจเป็นตัวเลือกที่ดีแทนที่จะเป็นโกลบอล:

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

หากตัวแปรไม่เปลี่ยนแปลงคุณสามารถใช้ define

ตัวอย่าง:

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

function footer()
{
    echo FOOTER_CONTENT;
}

2
จะเกิดอะไรขึ้นเมื่อFOOTER_CONTENTพยายามแก้ไข มันเหมือนกับfinalใน Java หรือconstใน C, C ++ และ C #?
Lion

4
หากคุณพยายามกำหนด FOOTER_CONTENT เป็นครั้งที่สอง php จะแจ้งให้ทราบเกี่ยวกับเรื่องนี้
Dale

ฉันต้องการคำนวณเวลายูนิกซ์ยุคปัจจุบันทุกครั้งที่โหลดหน้าเว็บจากนั้นใช้ค่านั้นในการคำนวณสองครั้ง (ฟังก์ชั่น) "define" ใช้งานได้สำหรับฉัน ตอนแรกฉันไม่เห็นว่า "echo FOOTER_CONTENT;" ไม่มี '$' ก่อนหน้าและฉันพบข้อผิดพลาด
user208145

หากตัวแปรจะไม่เปลี่ยนไม่ใช่ตัวแปร ไม่ใช่เหรอ!
Sajidur Rahman

29

เพิ่มตัวแปรของคุณใน $ GLOBALS super global array เช่น

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

และใช้งานได้ทั่วโลก

หรือคุณสามารถใช้ค่าคงที่ซึ่งสามารถเข้าถึงได้ตลอดสคริปต์

define('HOSTNAME', 'localhost');  

1
หากคุณใช้ 'define' เมื่อตั้งค่าแล้วคุณจะไม่สามารถเปลี่ยน define ได้!
Reza MA

ในตัวอย่างแรกของคุณมันบอกว่าตอนนี้ '$ variable เรียกว่า' localhost 'ในสคริปต์?
Zach Smith

ไม่ถ้าคุณต้องการใช้ตัวแปรนี้คุณต้องใช้มันเช่น $ GLOBALS ['variable'];
Pankaj Khairnar

25

หากมีการประกาศตัวแปรภายนอกฟังก์ชันอยู่ในขอบเขตส่วนกลางแล้ว ดังนั้นไม่จำเป็นต้องประกาศ แต่จากตำแหน่งที่คุณเรียกตัวแปรนี้จะต้องสามารถเข้าถึงตัวแปรนี้ได้ หากคุณกำลังโทรจากภายในฟังก์ชั่นที่คุณต้องใช้globalคำหลัก:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

การใช้คำหลักสากลนอกฟังก์ชั่นไม่ใช่ข้อผิดพลาด globalหากคุณต้องการที่จะรวมไฟล์นี้ภายในฟังก์ชั่นที่คุณสามารถประกาศตัวแปร

config.php

global $variable;

$variable = 5;

other.php

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

คุณสามารถใช้$GLOBALSเช่นกัน มันเป็น superglobal ดังนั้นจึงสามารถเข้าถึงได้ทุกที่

$GLOBALS['variable'] = 5;

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

ขึ้นอยู่กับทางเลือกของคุณคุณสามารถเลือกอย่างใดอย่างหนึ่ง


9

คำตอบนี้ช้ามาก แต่สิ่งที่ฉันทำคือการกำหนดคลาสที่เก็บค่าบูลีน, อาร์เรย์และค่าเริ่มต้นจำนวนเต็มเป็นตัวแปรสแตติกขอบเขตแบบโกลบอล สตริงคงที่ใด ๆ ที่ถูกกำหนดเช่นนี้

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

staticคำหลักที่จะต้องนำเสนอในชั้นเรียนอื่นที่ vars $ a, $ B, C และ $ จะไม่ถูกกำหนดขอบเขตทั่วโลก


นี่เป็นทางออกที่ดีด้วยเหตุผลหลายประการ คลาสแบบสแตติกต้องการเพียงไม่กี่อักขระที่เพิ่มให้กับชื่อตัวแปรพื้นฐาน: G :: $ Name โดยที่การประกาศจะมีลักษณะดังนี้: คลาส G {สแตติก $ ชื่อ, $ Name2;} โปรดทราบว่า G สามารถเป็นตัวแปรระดับโลกอย่างแท้จริง ใช้สำหรับตัวแปรที่เกี่ยวข้องกับพนักงาน นี่เป็นโปรแกรมที่ง่ายกว่าด้วยกระบวนทัศน์เชิงวัตถุที่สนับสนุนโดย PHP หากค่าคงที่มีความจำเป็นอย่างแท้จริงคุณสามารถประกาศได้หลังจาก "const" เหมือนกับตัวแปรที่ประกาศหลังจาก "คงที่" - เพียงแค่ปล่อยสัญญาณดอลลาร์ G :: ตัวอย่างจะเป็นตัวอย่างของค่าคงที่ทั่วโลก
David Spector

5

คุณตอบคำถามนี้ในแบบที่คุณเขียนคำถาม - ใช้ 'define' แต่เมื่อตั้งค่าแล้วคุณจะไม่สามารถเปลี่ยนการกำหนดได้

นอกจากนี้ยังมีลูกเล่นที่มีค่าคงที่ในคลาสเช่น class :: constant ที่คุณสามารถใช้ได้ นอกจากนี้คุณยังสามารถทำให้พวกเขาตัวแปรโดยการประกาศคุณสมบัติคงที่ให้กับชั้นเรียนด้วยฟังก์ชั่นการตั้งค่าคุณสมบัติคงที่ถ้าคุณต้องการที่จะเปลี่ยน


5

คุณสามารถลองใช้คำสำคัญuseในฟังก์ชั่นปิดหรือLambdasถ้าสิ่งนี้เหมาะกับคุณ ... PHP 7.0 ไม่ใช่ว่ามันจะดีกว่า แต่เป็นทางเลือก

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

การสาธิต | ข้อมูล


1

ลองคิดแตกต่างกันเล็กน้อย:

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

และคุณสามารถใช้และแก้ไขได้ทุกอย่างที่คุณต้องการเช่น:

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

0

ถ้าคุณใช้ฟังก์ชันโพรซีเดอร์แทนตัวแปรแล้วเรียกพวกมันว่าคุณอยู่ที่ไหน

ฉันมักจะทำชุดของค่าการกำหนดค่าและวางไว้ในฟังก์ชั่นที่มีคำสั่งกลับ ฉันเพิ่งรวมที่ที่ฉันต้องใช้ประโยชน์จากค่าทั่วโลกและฟังก์ชั่นการโทรเฉพาะ

function host()
{
   return "localhost";
}

0

$GLOBALS[] เป็นทางออกที่ถูกต้อง แต่เนื่องจากเรากำลังพูดถึงทางเลือกฟังก์ชั่นจึงสามารถทำงานนี้ได้อย่างง่ายดาย:

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

function my_var() {
    return 'Rome';
}

-19

คุณไม่ควรใช้ globals อีกต่อไป แต่ไม่มีใน PHP 5.4


19
ลงทะเบียน GLOBALS จะถูกลบออก ไม่กลม
unity100

7
คำตอบนี้เป็นลายลักษณ์อักษรผิดและควรได้รับการอัปเดตเพื่อแสดงความคิดเห็นของ unity100 หากยังคงมี GLOBALS อยู่โปรดชี้แจงว่าการเปลี่ยนแปลงของ GLOBAL vars นั้นมีลักษณะอย่างไร บางสิ่งเช่นนี้
crashwap


@RobertColumbia โพสต์ที่น่าสนใจมากและฉันจะคำนึงถึงคำตอบอื่น ๆ แต่ก็ไม่สามารถใช้ได้ในกรณีนี้ (ฉันหวังว่าคุณจะใช้เมตานั้นเพื่อชี้ให้เห็นว่าคำตอบ“ ไม่ทำเช่นนั้น” อาจใช้ได้และไม่ใช่เหตุผลที่ว่านี่คือ;)) " " อย่าทำอย่างนั้น " อาจ เป็นคำตอบที่ถูกต้อง . "-" สามารถเป็น "ไม่ได้" คือ " " แต่บางครั้งไม่ต้องทำอะไรเลยถ้าคุณเพิ่งหยุดทำสิ่งผิดทุกอย่างจะเริ่มทำงานได้อย่างน่าอัศจรรย์อีกครั้ง " - ไม่ได้ใช้ที่นี่เพราะรหัสไม่ "แตก" OP ต้องการเพียงวิธี "พิมพ์น้อยลง" ในการทำสิ่งต่าง ๆ …
robinCTS

" จริง ๆ แล้วมันพยายามตอบคำถามหรือไม่ในกรณีส่วนใหญ่เป็น " - "ส่วนใหญ่" ไม่ใช่ "ทั้งหมด" (ฉันจะโต้แย้ง "มากที่สุด" แต่ฉันไม่เห็นคำตอบดังกล่าวเพียงพอที่จะโต้แย้งอย่างเป็นทางการ) " ในกรณีนี้มันไม่ใช่ " - และใน "คำตอบ" นี้ก็ไม่ได้ด้วยเหตุผลเดียวกัน: " ยิ่งคำตอบของเมอร์ฟีไม่ได้เสนอวิธีแก้ปัญหา " และ " มันไม่ได้ให้ ผู้ถามเครื่องมือหรือวิธีการหรืออะไรก็ตามที่คล้ายคลึงกับวิธีแก้ไขปัญหาของเขา " …
robinCTS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.