Làm thế nào để khai báo một biến toàn cục trong php?


168

Tôi có mã như thế này:

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

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

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

Có cách nào để xác định biến toàn cục ở một nơi và làm cho biến $acó thể truy cập được trong tất cả các hàm cùng một lúc không? mà không sử dụng global $a;nhiều hơn?


15
Không, không có. Nếu bạn không thích globaltừ khóa, hãy cân nhắc sử dụng siêu lớp $GLOBALS['a']trong tất cả các phạm vi hoặc xem xét chuyển tham số cho các hàm của bạn.
Michael Berkowski

5
Nếu đó là một cái gì đó quan trọng thì thậm chí một var phiên có thể được sử dụng.
Nikos Tsirakis

Câu trả lời:


259

Các $GLOBALSmảng có thể được sử dụng thay vì:

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

function body(){

    echo $GLOBALS['a'];
}

Từ sách hướng dẫn :

Một mảng kết hợp có chứa các tham chiếu đến tất cả các biến hiện được xác định trong phạm vi toàn cục của tập lệnh. Tên biến là các khóa của mảng.


Nếu bạn có một tập hợp các hàm cần một số biến chung, một lớp có các thuộc tính có thể là một lựa chọn tốt thay vì toàn cục:

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

Nếu biến không thay đổi, bạn có thể sử dụng define

Thí dụ:

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

function footer()
{
    echo FOOTER_CONTENT;
}

2
Điều gì xảy ra khi FOOTER_CONTENTcố gắng sửa đổi? Nó giống như finaltrong Java hay consttrong C, C ++ và C #?
Sư tử

4
Nếu bạn cố gắng xác định FOOTER_CONTENT lần thứ hai, php sẽ đưa ra thông báo về nó
Dale

Tôi cần tính thời gian kỷ nguyên unix hiện tại mỗi lần tải trang, sau đó sử dụng giá trị đó trong một vài phép tính (hàm). "xác định" làm việc cho tôi. Ban đầu, tôi không thấy rằng "echo FOOTER_CONTENT;" không có '$' trước đó và tôi đã gặp lỗi.
dùng208145

Nếu biến sẽ không thay đổi thì đó không phải là biến. Phải không?!
Sajidur Rahman

29

Thêm các biến của bạn trong mảng siêu toàn cầu $ GLOBALS như

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

và sử dụng nó trên toàn cầu

hoặc bạn có thể sử dụng hằng số có thể truy cập trong toàn bộ tập lệnh

define('HOSTNAME', 'localhost');  

1
Nếu bạn sử dụng 'xác định', một khi được đặt, bạn không thể thay đổi định nghĩa!
Reza MA

trong ví dụ đầu tiên của bạn, người ta nói rằng '$ biến bây giờ được gọi là' localhost 'trong tập lệnh?
Zach Smith

không, nếu bạn muốn sử dụng biến này, bạn phải sử dụng biến như $ GLOBALS ['biến'];
Pankaj Khairnar

25

Nếu một biến được khai báo bên ngoài hàm thì nó đã nằm trong phạm vi toàn cục. Vì vậy, không cần phải khai báo. Nhưng từ nơi bạn gọi biến này phải có quyền truy cập vào biến này. Nếu bạn đang gọi từ bên trong một chức năng, bạn phải sử dụng globaltừ khóa:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Sử dụng từ khóa toàn cầu bên ngoài một chức năng không phải là một lỗi. Nếu bạn muốn bao gồm tệp này trong một hàm, bạn có thể khai báo biến là global.

config.php

global $variable;

$variable = 5;

other.php

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

Bạn có thể sử dụng $GLOBALSlà tốt. Đó là một siêu lớp nên nó có quyền truy cập ở mọi nơi.

$GLOBALS['variable'] = 5;

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

Tùy thuộc vào sự lựa chọn của bạn, bạn có thể chọn một trong hai.


9

Câu trả lời này là rất muộn nhưng những gì tôi làm là đặt một lớp chứa Booleans, mảng và các giá trị ban đầu là số nguyên biến phạm vi toàn cầu. Bất kỳ chuỗi hằng được định nghĩa như vậy.

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

Các statictừ khóa phải có mặt trong lớp khác, các vars $ a, $ b và $ c sẽ không nằm trong phạm vi toàn cầu.


Đây là một giải pháp tốt vì nhiều lý do. Lớp tĩnh chỉ yêu cầu một vài ký tự được thêm vào tên biến cơ bản: G :: $ Name, trong đó khai báo trông như thế này: class G {static $ Name, $ Name2;} Lưu ý rằng G có thể là biến toàn cục thực sự, sau đó E có thể được sử dụng cho các biến liên quan đến Nhân viên. Điều này dễ lập trình hơn so với mô hình hướng đối tượng quy mô đầy đủ được PHP hỗ trợ. Nếu các hằng số thực sự cần thiết, bạn có thể khai báo chúng sau "const" giống như các biến được khai báo sau "tĩnh" - chỉ cần bỏ qua các ký hiệu đô la. G :: Ví dụ sẽ là một ví dụ về hằng số toàn cầu.
David Spector

5

Bạn đã trả lời câu hỏi này theo cách bạn viết câu hỏi - sử dụng 'xác định'. nhưng một khi được đặt, bạn không thể thay đổi định nghĩa.

Ngoài ra, có các thủ thuật với hằng số trong một lớp, chẳng hạn như lớp :: hằng mà bạn có thể sử dụng. Bạn cũng có thể biến chúng thành biến bằng cách khai báo các thuộc tính tĩnh cho lớp, với các hàm để đặt thuộc tính tĩnh nếu bạn muốn thay đổi nó.


5

Bạn có thể thử từ khóa usetrong các hàm Đóng hoặc Lambdas nếu điều này phù hợp với ý định của bạn ... PHP 7.0 mặc dù. Không phải là tốt hơn, nhưng chỉ là một thay thế.

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

bản demo | thông tin


1

Hãy nghĩ khác đi một chút:

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

Và bạn có thể sử dụng và sửa đổi nó mọi lúc bạn thích, như:

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

0

Điều gì sẽ xảy ra nếu bạn sử dụng chức năng thủ tục thay vì biến và gọi chúng bất kỳ nơi nào như bạn.

Tôi thường tạo một tập hợp các giá trị cấu hình và đặt chúng bên trong một hàm với câu lệnh return. Tôi chỉ bao gồm rằng nơi tôi cần sử dụng giá trị toàn cầu và gọi hàm cụ thể.

function host()
{
   return "localhost";
}

0

$GLOBALS[] giải pháp phù hợp, nhưng vì chúng ta đang nói về các lựa chọn thay thế, một chức năng cũng có thể thực hiện công việc này một cách dễ dàng:

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

function my_var() {
    return 'Rome';
}

-19

Bạn không nên sử dụng toàn cầu nữa, chúng không có sẵn trong PHP 5.4.


19
ĐĂNG KÝ TOÀN CẦU được gỡ bỏ. không phải toàn cầu.
unity100

7
Câu trả lời này, như đã viết, là sai và cần được cập nhật để phản ánh nhận xét của unity100. Nếu GLOBALS vẫn có sẵn, vui lòng làm rõ những khía cạnh nào của bình GLOBAL đã thay đổi. Một cái gì đó như thế này.
tai nạn


@RobertColumbia Bài đăng rất thú vị và tôi sẽ lưu ý đến các câu trả lời khác, nhưng, nó không áp dụng trong trường hợp cụ thể này. (Tôi hy vọng bạn chỉ đang sử dụng meta đó để chỉ ra cách mà một người không thực hiện câu trả lời đó thể hợp lệ và không phải là bằng chứng rằng câu này là;)) " " Đừng làm vậy " có thể là một câu trả lời hợp lệ . "-" có thể là "không" là ". " Nhưng đôi khi, không có gì cần phải làm thay thế. Nếu bạn ngừng làm sai, mọi thứ sẽ bắt đầu hoạt động trở lại một cách kỳ diệu. " - Không áp dụng ở đây vì mã không bị "hỏng". OP chỉ muốn một cách làm việc "ít gõ" hơn. ...
robinCTS

" có thực sự cố gắng trả lời câu hỏi không? Trong hầu hết các trường hợp, nó là vậy. " - "Hầu hết", không phải "tất cả". (Tôi thậm chí sẽ tranh luận "nhất", nhưng tôi chưa thấy đủ câu trả lời như vậy để đưa ra một lập luận có hiểu biết.). " Trong trường hợp này, không phải vậy. " - Và trong "câu trả lời" này cũng không phải, vì những lý do rất giống nhau: " Tệ hơn, câu trả lời của Murphy không đề xuất giải pháp cho vấn đề. " Và " Nó không đưa ra người hỏi một công cụ hoặc một phương pháp hay bất cứ thứ gì tương tự như một giải pháp cho vấn đề của anh ta ". ...
robinCTS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.