2013-03-28 41 views
43

Theo quy tắc phạm vi ngôn ngữ lập trình nhất, tôi có thể truy cập các biến được định nghĩa bên ngoài các hàm bên trong chúng, nhưng tại sao mã này không hoạt động?Truy cập PHP biến toàn cục trong hàm

<?php 
$data='My data'; 
function menugen(){ 

    echo "[".$data."]"; 
} 
menugen(); 
?> 

[] ở đầu ra.

+3

Đừng đối xử với nó như toàn cầu, vượt qua nó với chức năng như một cuộc tranh cãi –

+1

đâu nói hướng dẫn những việc như vậy? – deceze

+0

Đọc liên quan: [PHP global in functions] (http://stackoverflow.com/q/5166087/1409082) – Jocelyn

Trả lời

83

Nó không phải là làm việc vì bạn để khai báo các biến toàn cầu, bạn sẽ được truy cập vào:

$data='My data'; 
function menugen(){ 
    global $data; // <-- add this line 
    echo "[".$data."]"; 
} 
menugen(); 

nếu không bạn có thể truy cập nó dưới dạng $GLOBALS['data'], xem http://php.net/manual/en/language.variables.scope.php

Thậm chí nếu một chút OT, tôi khuyên bạn nên tránh sử dụng globals ở tất cả và thích đi qua như các tham số.

+0

Cảm ơn, Bạn đã đúng nhưng họ không sử dụng dòng này trong ví dụ thứ hai của hướng dẫn sử dụng: http: //php.net/manual/en/language.variables.scope.php –

+3

Thực tế là ví dụ thứ hai đã có để hiển thị độc giả những gì ** không ** làm: 'Kịch bản này sẽ không tạo ra bất kỳ đầu ra nào vì câu lệnh echo đề cập đến phiên bản cục bộ của biến $ a, và nó chưa được gán giá trị trong phạm vi này.' –

+1

Dang! Tôi đã phải đăng nhập để upvote câu trả lời này chỉ vì tôi creepily quên php biến phạm vi. –

0

Bạn cần phải vượt qua biến thành các chức năng:

$data = 'My data'; 

function menugen($data) 
{ 
    echo $data; 
} 
6

Đó là vấn đề về phạm vi. Nói tóm lại, các biến toàn cầu nên tránh SO:

Bạn có thể cần phải vượt qua nó như một tham số:

$data = 'My data'; 

function menugen($data) 
{ 
    echo $data; 
} 

HOẶC có nó trong một lớp và truy cập nó

class MyClass 
{ 
    private $data = ""; 

    function menugen() 
    { 
     echo this->data; 
    } 

} 

Chỉnh sửa: Xem @MatteoTassinari câu trả lời cũng như bạn có thể đánh dấu nó như là toàn cầu để truy cập nó, nhưng toàn cầu vars thường không cần thiết vì vậy nó sẽ là khôn ngoan để tái nghĩ mã hóa của bạn.

+0

và một cách khác là sử dụng từ khóa ** toàn cầu ** (được cấp, đây không phải là cách tốt nhất). – Jocelyn

+0

Vâng, chỉ cần chỉnh sửa để thêm đề cập đến bài đăng của Matteo. – webnoob

+0

"Nên" không trả lời câu hỏi, và điều này có thể không phải là cách tiếp cận tốt nhất cho mọi trường hợp. Đối với các kịch bản đơn giản, việc thay đổi các tham số xung quanh và thêm các lớp là clunky. Giống như JavaScript, trong PHP không phải mọi thứ đều cần hướng đối tượng và được đặt tên lên wazoo. – Beejor

7

Bạn có thể làm một trong các cách sau:

<?php 
$data='My data'; 
function menugen(){ 
    global $data; 
    echo "[".$data."]"; 
} 
menugen(); 

Hoặc

<?php 
$data='My data'; 
function menugen(){ 
    echo "[".$GLOBALS['data']."]"; 
} 
menugen(); 

đó đang được nói, lạm dụng globals có thể dẫn đến một số mã nghèo. Nó thường là tốt hơn để vượt qua trong những gì bạn cần. Ví dụ thay vì tham chiếu đến một đối tượng cơ sở dữ liệu toàn cầu, bạn nên truyền vào một cơ sở dữ liệu cho cơ sở dữ liệu và hành động theo đó. Điều này được gọi là Dependency Injection. Nó làm cho cuộc sống của bạn dễ dàng hơn nhiều khi bạn thực hiện kiểm tra tự động (mà bạn nên).

3

Một cách khác để làm điều đó:

<?php 

$data = 'My data'; 

$menugen = function() use ($data) { 

    echo "[".$data."]"; 
}; 

$menugen(); 
-1

Nếu bạn muốn, bạn có thể sử dụng "định nghĩa" chức năng nhưng chức năng này tạo ra một hằng số mà không thể thay đổi một lần xác định.

<?php 
define("GREETING", "Welcome to W3Schools.com!"); 

function myTest() { 
    echo GREETING; 
} 

myTest(); 
?> 

http://www.w3schools.com/php/php_constants.asp

+0

Điều này xác định một hằng số toàn cầu, không phải là một biến. – Beejor

+0

Điểm khác biệt là gì? Bạn có thể lưu trữ bất kỳ thứ gì trong đó –

+2

Không thể thay đổi các hằng số khi đã xác định. – Beejor

Các vấn đề liên quan