2011-01-13 40 views
62

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


front.inc:

$name = 'james'; 

index.php:

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

đầu ra: james


e nd.inc:

echo $name; 

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


NẾU Tôi tuyên bố tên $ toàn cầu trước khi lặp lại tên $ trong end.inc, sau đó nó hoạt động đúng cách. 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: Passing variables in PHP from one file to another

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

+2

bao gồm không thích chức năng. bao gồm không phá vỡ phạm vi biến. nó giống như 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 vang trong end.inc trong một hàm? – dqhendricks

+2

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

Trả lời

52

Khi bao gồm tệp trong PHP, nó hoạt động như mã tồn tại trong tệp mà chúng đang được bao gồm. 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 của bạn trực tiếp vào index.php của bạn. Đó là cách PHP làm việc 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 trong tập tin front.inc của bạn, và sau đó bao gồm cả front.incend.inc trong index.php của bạn, bạn sẽ có thể echo biến $name bất cứ nơi nào sau khi include của front.inc trong số index.php của bạn. Một lần nữa, PHP xử lý index.php của bạn như thể mã từ hai tệp bạn đang bao gồm là phần của tệp.

Khi bạn đặt echo trong một tệp được bao gồm, đến một biến không được xác định trong chính nó, bạn sẽ không nhận được kết quả vì nó được xử lý riêng biệt.

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

+34

Phản hồ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 tin cũng giống như tất cả các mã chỉ đơn giản là một phần của một tập tin. Vì vậy, những gì tôi mô tả trong bài viết của tôi sẽ tương đương với: $ name = 'james'; echo $ name; echo $ name; - Điều đó sẽ tạo ra jamesjames. Nhưng đoạn thứ hai của bạn cuối cùng mâu thuẫn với những gì tôi vừa mô tả. Có lẽ những gì bạn có nghĩa là chỉ các tập tin làm cho cuộc gọi bao gồm có quyền truy cập vào các biến của tập tin bao gồm, vì vậy các tập tin bao gồm khác không có quyền truy cập vào các biến đó. Đúng không? – maxedison

+18

Vâng, điều đó nghe có vẻ chính xác. Xin lỗi nếu những gì tôi nói là khó hiểu. Tôi đã chỉnh sửa nó như 5 lần bởi vì tôi đã thực sự khó mô tả quá trình mà không làm bạn mất. Vì vậy, tệp gốc 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. –

+0

hoàn hảo. cảm ơn michael. – maxedison

25

Đây là một cạm bẫy để tránh. Trong trường hợp bạn cần truy cập vào tên $ biến của bạn trong một hàm, bạn cần phải nói "tên $ toàn cục"; ở đầu hàm đó. Bạn cần phải lặp lại điều này cho mỗi chức năng trong cùng một tập tin.

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 để thực hiện điều đó sẽ là:

include('front.inc'); 

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

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

foo(); 
bar(); 
+0

Điều này hoạt động hoàn hảo –

+0

Nói cách khác: viết 'global $ var' trước khi bạn sử dụng nó trong một hàm khác. –

-10

Tôi có một giải pháp kỳ lạ cho điều đó. trong file end.inc, thêm dòng này:

$name=$name; 

Sau đó, tiếng vang sẽ làm việc.

Tôi đã truy cập vào giải pháp này trong dự án của mình mà không giải thích lý do tại sao nó hoạt động như thế này.

+2

Bạn có thể có lỗi đánh máy. – Aziz

+0

Tôi đã thực sự thấy điều này xảy ra. Hầu như tình huống chính xác. bao gồm ('data.php'); [$ action = 'sign in';] echo $ action; không có gì hoạt động, kỳ quặc đủ $ action = $ action; echo $ action đã sửa nó. Tôi chỉ ra là một vấn đề đệm trong php vì một lý do nào đó. Các tệp của tôi chỉ dài đến đâu. –

+0

Wowee, có rất nhiều khủng hoảng về anh chàng này. Có lẽ bạn nên cho chúng tôi những hoàn cảnh mà theo đó điều này xảy ra, hoặc ít nhất là giải thích, bởi vì câu trả lời này không hữu ích cho ai đó không biết gì về những gì đang diễn ra. –

-2

Đây là tất cả các bạn phải làm:

Trong front.inc

global $name; 
$name = 'james'; 
+0

Thêm một số giải thích với câu trả lời cho cách câu trả lời này giúp OP trong việc khắc phục sự cố hiện tại –

+0

Tôi đã có cùng một vấn đề như được mô tả bởi maxedison. Tôi cũng bị nhầm lẫn với nhiều câu trả lời: "quá trình php bao gồm như bạn sao chép và dán ..." là không đúng và nhờ lời giải thích của Michael theo câu trả lời của mình 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 tôi, 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

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