Chuyển một biến từ một tệp bao gồm php sang tệp khác: global vs. not


76

Tôi đang cố chuyển một biến từ tệp bao gồm này sang tệp bao gồm khác. Điều này KHÔNG hoạt động trừ khi tôi khai báo biến là toàn cục trong tệp bao gồm thứ hai. Tuy nhiên, tôi KHÔNG cần phải khai báo nó là toàn cục trong tệp đang gọi bao gồm đầu tiên. Ví dụ:


front.inc:

$name = 'james';

index.php:

include('front.inc');
echo $name;
include('end.inc');

đầu ra: james


end.inc:

echo $name;

đầu ra: không có gì


NẾU tôi khai báo tên $ toàn cầu trước khi lặp lại $ name trong end.inc, thì nó hoạt động bình thường. Câu trả lời được chấp nhận cho bài đăng này giải thích rằng điều này phụ thuộc vào cấu hình máy chủ của bạn: Chuyển các biến trong PHP từ tệp này sang tệp khác

Tôi đang sử dụng máy chủ Apache. Tôi sẽ cấu hình nó như thế nào để không cần khai báo $ name là global? Có những lợi thế / bất lợi cho cái này so với cái kia?


2
bao gồm không giống như các chức năng. bao gồm không phá vỡ phạm vi biến. nó giống như thể bạn sao chép dán nội dung tệp bao gồm trực tiếp vào tập lệnh gọi.
dqhendricks

2
là tiếng vọng cuối cùng .inc trong một hàm?
dqhendricks

2
điều đó sẽ phá vỡ phạm vi biến. và trong trường hợp đó, bạn có thể nên chuyển $ name cho hàm trong một đối số.
dqhendricks

Điều này sẽ hoạt động như được viết!
dối trá

echo cuối cùng .inc không nằm trong một hàm. Giả sử rằng ba tệp tôi mô tả ở trên không chứa nhiều hơn không kém chính xác những gì tôi đã viết.
maxedison

Câu trả lời:


62

Khi bao gồm các tệp trong PHP, nó hoạt động giống như mã tồn tại trong tệp mà chúng đang được đưa vào. Hãy tưởng tượng sao chép và dán mã từ bên trong mỗi tệp được bao gồm trực tiếp vào của bạn index.php. Đó là cách PHP hoạt động với bao gồm.

Vì vậy, trong ví dụ của bạn, vì bạn đã thiết lập một biến gọi là $nameở bạn front.inctập tin, và sau đó bao gồm cả hai front.incend.inctrong của bạn index.php, bạn sẽ có thể echobiến $namebất cứ nơi nào sau khi includecácfront.inc bên trong của bạn index.php. Một lần nữa, PHP xử lý của bạn index.phpnhư thể mã từ hai tệp bạn đang bao gồm là một phần của tệp.

Khi bạn đặt một echotrong một tệp được bao gồm, vào một biến không được định nghĩa trong chính nó, bạn sẽ không nhận được kết quả vì nó được xử lý riêng biệt so với bất kỳ tệp nào khác được bao gồm.

Nói cách khác, để thực hiện hành vi mà bạn mong đợi, bạn sẽ cần phải xác định nó là một hành vi toàn cầu.


51
Câu trả lời của bạn dường như mâu thuẫn với chính nó. Bạn đã nói một vài lần rằng bao gồm một tệp giống như thể tất cả mã chỉ là một phần của một tệp. Do đó, những gì tôi mô tả trong bài đăng của mình sẽ tương đương với: $ name = 'james'; echo $ tên; echo $ tên; - Điều đó sẽ tạo ra jamesjames. Nhưng đoạn văn từ thứ hai đến cuối cùng của bạn mâu thuẫn với những gì tôi vừa mô tả. Có lẽ ý của bạn là CHỈ có tệp thực hiện lệnh gọi bao gồm mới có quyền truy cập vào các biến của tệp được bao gồm, vì vậy các tệp được bao gồm khác KHÔNG có quyền truy cập vào các biến đó. Đúng không?
maxedison

24
Vâng, điều đó nghe có vẻ chính xác. Xin lỗi nếu tôi những gì tôi đã nói là khó hiểu. Tôi đã chỉnh sửa nó 5 lần vì tôi thực sự khó khăn để mô tả quá trình này mà không làm bạn bị lạc. Vì vậy, tệp mẹ có quyền truy cập vào các biến trong cả hai tệp được bao gồm, nhưng tệp được bao gồm không có quyền truy cập vào tệp được bao gồm khác. Nếu mà làm cho bất kỳ ý nghĩa.
Michael Irigoyen

Cũng như câu trả lời được chấp nhận, sự sửa chữa của nó cũng sai (hoặc lỗi thời). Trong PHP7 (ít nhất), tôi có thể xác định một biến trong đó included1.phpvà tham chiếu nó sau này included2.phpmà không cần tham chiếu đến nó parent.phpvà lấy giá trị mà tôi đã xác định included1.php. Tôi tuân theo các quy tắc phạm vi tương tự như tôi sẽ làm nếu tất cả mã nằm trên một trang duy nhất. Chỉ có bấy nhiêu thôi.
biscuitstack

3
Bỏ phiếu xuống vì hai đoạn đầu mâu thuẫn với câu sau rõ ràng.
Trận lụt Joshua

Tóm lại: ném tệp được bao gồm của bạn vào một hàm và chuyển các biến cần thiết làm tham số. Nó đáng ghét nhưng nó hoạt động. 😒︀
John

32

Đây là một cạm bẫy cần tránh. Trong trường hợp bạn cần truy cập biến $ name của mình trong một hàm, bạn cần nói "global $ name;" ở đầu của hàm đó. Bạn cần lặp lại điều này cho từng chức năng trong cùng một tệp.

include('front.inc');
global $name;

function foo() {
  echo $name;
}

function bar() {
  echo $name;
}

foo();
bar();

sẽ chỉ hiển thị lỗi. Cách chính xác để làm điều đó sẽ là:

include('front.inc');

function foo() {
  global $name;
  echo $name;
}

function bar() {
  global $name;
  echo $name;
}

foo();
bar();

Nói cách khác: viết global $vartrước khi bạn sử dụng nó trong một chức năng khác.
Chris Hạnh phúc

2

Đây là tất cả những gì bạn phải làm:

Phía trước.inc

global $name;
$name = 'james';

2
Thêm một số giải thích với câu trả lời về cách thức này trả lời giúp đỡ OP trong sửa chữa vấn đề hiện tại
ρяσѕρєя K

1
Tôi đã gặp vấn đề tương tự như mô tả của maxedison. Tôi cũng bối rối với nhiều câu trả lời: "quy trình php bao gồm như bạn sao chép và dán ..." điều này không đúng và nhờ sự giải thích của Michael dưới câu trả lời của anh ấy, tôi hiểu rằng mã trong tệp được bao gồm không nhận ra biến toàn cục được xác định trong tệp bao gồm trước đó . Trong các thử nghiệm của mình, tôi cũng đã gặp rằng nếu tôi sử dụng từ khóa "toàn cầu" trong iclude đầu tiên có thể sửa lỗi này - như Paul đã trả lời. Nhưng tôi có thể tìm thấy cả hai trường hợp được mô tả trong tài liệu PHP ở đâu? Và câu hỏi thứ hai là nếu cả hai đều không đúng với một số phiên bản PHP?
StackPeter
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.