Biến vượt qua PHP để bao gồm


81

Tôi đang cố chuyển một biến vào một tệp bao gồm . Máy chủ của tôi đã thay đổi phiên bản PHP và bây giờ bất kỳ giải pháp nào tôi thử đều không hoạt động.

Tôi nghĩ rằng tôi đã thử mọi lựa chọn mà tôi có thể tìm thấy. Tôi chắc rằng đó là điều đơn giản nhất!

Biến cần được đặt và đánh giá từ tệp đầu tiên đang gọi (thực tế là $_SERVER['PHP_SELF']và cần trả về đường dẫn của tệp đó, không phải được bao gồm second.php).

LỰA CHỌN MỘT

Trong tệp đầu tiên:

global $variable;
$variable = "apple";
include('second.php');

Trong tệp thứ hai:

echo $variable;

LỰA CHỌN HAI

Trong tệp đầu tiên:

function passvariable(){
    $variable = "apple";
    return $variable;
}
passvariable();

LỰA CHỌN BA

$variable = "apple";
include "myfile.php?var=$variable"; // and I tried with http: and full site address too.


$variable = $_GET["var"]
echo $variable

Không ai trong số này làm việc cho tôi. Phiên bản PHP là 5.2.16.

Tôi đang thiếu gì?

Cảm ơn!


2
Bạn đã thử từ chối một hằng số chưa?
Oussama Jilal

6
bạn không phải chuyển các biến vào để bao gồm các tệp. máy chủ web của bạn sẽ chỉ tải mã của các tệp của bạn khi bạn bao gồm chúng giống như khi bạn đã viết mã đó từ tệp bao gồm vào tệp khác của bạn.
Leon Kramer

Bạn có thể làm rõ 'Không có tác phẩm nào trong số này'? Thông báo lỗi cũng sẽ hữu ích ... Và, AFAIK, mã bao gồm được thực thi trong cùng một ngữ cảnh, vì vậy globalkhông cần thiết; tùy chọn đầu tiên của bạn sẽ chạy tốt.
raina77ow

Như những người khác đã nói, include () giống như việc dán mã vào đó, nó tiếp tục thực thi mã giống như ở trong cùng một tệp. Bạn không cần phải tìm cách đưa biến vào tệp include, bạn có thể chỉ cần viết nó trước hàm include () (nếu cần).
adrianTNT

Câu trả lời:


48

Bạn có thể sử dụng hàm extract ()
Drupal sử dụng nó, trong hàm theme () của nó.

Đây là một hàm kết xuất với một $variablesđối số.

function includeWithVariables($filePath, $variables = array(), $print = true)
{
    $output = NULL;
    if(file_exists($filePath)){
        // Extract the variables to a local namespace
        extract($variables);

        // Start output buffering
        ob_start();

        // Include the template file
        include $filePath;

        // End buffering and return its contents
        $output = ob_get_clean();
    }
    if ($print) {
        print $output;
    }
    return $output;

}


./index.php:

includeWithVariables('header.php', array('title' => 'Header Title'));

./header.php:

<h1><?php echo $title; ?></h1>

Bạn cũng có thể sử dụng phương pháp này thêm EXTR_REFS cờ đến chức năng chiết xuất (xem php.net/manual/en/function.extract.php ) để khi bạn vượt qua một biến với tài liệu tham khảo: array( 'title' => &$title )các $ title có thể được thay đổi bên trong các tập tin bao gồm .
Mauro Mascia

Tôi không nghĩ rằng điều này hoạt động trong các phiên bản PHP sau này, giả sử 7.3
Robert Moskal

45

Tùy chọn 3 là không thể - bạn sẽ nhận được kết xuất hiển thị của tệp .php, chính xác như bạn sẽ làm nếu bạn nhấn url đó trong trình duyệt của mình. Nếu bạn có mã PHP thô thay vào đó (như bạn muốn), thì TẤT CẢ mã nguồn của trang web của bạn sẽ bị lộ ra ngoài, điều này thường không phải là một điều tốt.

Tùy chọn 2 không có nhiều ý nghĩa - bạn đang ẩn biến trong một hàm và phải tuân theo phạm vi biến của PHP. Bạn cũng phải có $var = passvariable()một nơi nào đó để đưa biến 'bên trong' đó ra 'bên ngoài', và bạn trở lại hình vuông.

tùy chọn 1 là thiết thực nhất. include()về cơ bản sẽ lướt trong tệp được chỉ định và thực thi nó ngay tại đó, như thể mã trong tệp thực sự là một phần của trang mẹ. Nó trông giống như một biến toàn cục, mà hầu hết mọi người ở đây đều băn khoăn, nhưng theo ngữ nghĩa phân tích cú pháp của PHP, hai biến này giống hệt nhau:

$x = 'foo';
include('bar.php');

$x = 'foo';
// contents of bar.php pasted here

11

Xem xét rằng trạng thái bao gồm trong php ở cấp độ cơ bản nhất lấy mã từ một tệp và dán nó vào nơi bạn đã gọi nó và thực tế là hướng dẫn sử dụng bao gồm nêu rõ như sau:

Khi một tệp được bao gồm, mã trong đó sẽ kế thừa phạm vi biến của dòng mà trên đó bao gồm xuất hiện. Bất kỳ biến nào có sẵn tại dòng đó trong tệp đang gọi sẽ có sẵn trong tệp được gọi, kể từ thời điểm đó trở đi.

Những điều này khiến tôi nghĩ rằng có một vấn đề hoàn toàn khác nhau. Ngoài ra Tùy chọn số 3 sẽ không bao giờ hoạt động bởi vì bạn không chuyển hướng đến second.phpbạn chỉ bao gồm nó và tùy chọn số 2 chỉ là một công việc kỳ lạ. Ví dụ cơ bản nhất của trạng thái bao gồm trong php là:

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

Xem xét rằng tùy chọn số một là tùy chọn gần nhất với ví dụ này (mặc dù nó phức tạp hơn sau đó) và nó không hoạt động, nó khiến tôi nghĩ rằng bạn đã mắc lỗi trong câu lệnh include (đường dẫn sai liên quan đến gốc hoặc tương tự vấn đề).


Có lẽ tôi đã nhầm lẫn thứ tự của mọi thứ? Thực tế, cấu trúc là: main.php $ variable = $ _SERVER ['PHP_SELF']; bao gồm = ' side.com/footer.php ; footer.php: echo $ biến; Tất cả các tệp được bao gồm không chứa biến, nó chỉ thực hiện một cái gì đó với nó. Trong tất cả các tùy chọn tôi đã thử, đầu ra trống hoặc bao gồm $ _SERVER ['PHP_SELF'] của footer.php chứ không phải main.php. Điều này có gì khác biệt?
dùng1590646

5

Liên quan đến câu hỏi của OP, cụ thể là "Biến cần được đặt và đánh giá từ tệp đầu tiên đang gọi (thực ra là '$ _SERVER [' PHP_SELF ']" và cần trả về đường dẫn của tệp đó, không phải tệp thứ hai được bao gồm). php). "

Điều này sẽ cho bạn biết tệp bao gồm tệp nào. Đặt cái này vào tệp bao gồm.

$includer = debug_backtrace();
echo $includer[0]['file'];

Dựa trên nhận xét của OP trong câu hỏi của anh ấy "Biến cần được đặt và đánh giá từ tệp đầu tiên đang gọi (thực ra là '$ _SERVER [' PHP_SELF ']" và cần trả về đường dẫn của tệp đó, không phải tệp thứ hai được bao gồm). php). " Anh ta cần tìm ra đường dẫn của tệp đã bao gồm tệp second.php.
Jeremy1026

Ghi chú. (câu trả lời của bạn không rõ lắm, vui lòng làm rõ ["vì OP muốn lấy tên tệp gốc blah blah blah"]).
Madara's Ghost

5

Tôi gặp vấn đề tương tự ở đây, bạn có thể sử dụng mảng $ GLOBALS.

$GLOBALS["variable"] = "123";
include ("my.php");

Nó cũng sẽ chạy như vậy:

$myvar = "123";
include ("my.php");

....

echo $GLOBALS["myvar"];

Chúc một ngày tốt lành.


4

TÙY CHỌN 1 phù hợp với tôi, trong PHP 7, và chắc chắn nó cũng làm trong PHP 5. Và khai báo phạm vi toàn cục không cần thiết đối với tệp được bao gồm để truy cập biến, tệp được bao gồm - hoặc "bắt buộc" - là một phần của tập lệnh, chỉ cần đảm bảo bạn thực hiện "bao gồm" SAU khi khai báo biến. Có thể bạn có một số cấu hình sai với các biến phạm vi toàn cầu trong PHP.ini của bạn?

Hãy thử trong tệp đầu tiên:

  <?php 
  $myvariable="from first file";
  include ("./mysecondfile.php"); // in same folder as first file LOLL
  ?>

mysecondfile.php

  <?php 
  echo "this is my variable ". $myvariable;
  ?>

Nó sẽ hoạt động ... nếu nó không chỉ cố gắng cài đặt lại PHP.


3

Tôi đã gặp phải vấn đề này trong đó tôi có một tệp đặt các biến dựa trên tham số GET. Và tệp đó không thể cập nhật vì nó hoạt động chính xác trên một phần khác của hệ thống quản lý nội dung lớn. Tuy nhiên, tôi muốn chạy mã đó thông qua một tệp bao gồm mà không có các tham số thực sự nằm trong chuỗi URL. Giải pháp đơn giản là bạn có thể đặt các biến GET trong tệp đầu tiên như cách bạn làm với bất kỳ biến nào khác.

Thay vì:

include "myfile.php?var=apple";

Nó sẽ là:

$_GET['var'] = 'apple';
include "myfile.php";

1

Theo tài liệu php (xem $ _SERVER ) $ _SERVER ['PHP_SELF'] là "tên tệp của tập lệnh hiện đang thực thi".

Câu lệnh INCLUDE "bao gồm và đánh giá" tệp "được chỉ định và" mã mà nó chứa kế thừa phạm vi biến của dòng mà tệp bao gồm xuất hiện trên đó "(xem INCLUDE ).

Tôi tin rằng $ _SERVER ['PHP_SELF'] sẽ trả về tên tệp của tệp đầu tiên, ngay cả khi được sử dụng bởi mã trong 'second.php'.

Tôi đã thử nghiệm điều này với mã sau và nó hoạt động như mong đợi ($ phpSelf là tên của tệp đầu tiên).

// In the first.php file
// get the value of $_SERVER['PHP_SELF'] for the 1st file
$phpSelf = $_SERVER['PHP_SELF'];

// include the second file
// This slurps in the contents of second.php
include_once('second.php');

// execute $phpSelf = $_SERVER['PHP_SELF']; in the secod.php file
// echo the value of $_SERVER['PHP_SELF'] of fist file

echo $phpSelf;  // This echos the name of the First.php file.

0

Bạn có thể thực thi tất cả trong "second.php" thêm biến với jQuery

<div id="first"></div>

<script>
$("#first").load("second.php?a=<?php echo $var?>")
</scrpt>

0

Tôi biết đây là một câu hỏi cũ, nhưng bây giờ tình cờ gặp nó và không thấy ai đề cập đến điều này. vì vậy viết nó.

Tùy chọn một nếu được tinh chỉnh như thế này, nó cũng sẽ hoạt động.

Bản gốc

Lựa chọn một

Trong tệp đầu tiên:

global $variable; 
$variable = "apple"; 
include('second.php'); 

Trong tệp thứ hai:

echo $variable;

TWEAK

Trong tệp đầu tiên:

$variable = "apple"; 
include('second.php');

Trong tệp thứ hai:

global $variable;
echo $variable;

-1

Tôi thấy rằng tham số include cần phải là toàn bộ đường dẫn tệp, không phải là một đường dẫn tương đối hoặc một phần đường dẫn này để hoạt động.


1
Không, điều đó không chính xác. Các đường dẫn tương đối hoạt động tốt trong include's. Bạn chỉ cần chắc chắn rằng bạn đang giả định một "liên quan đến những gì" bắt đầu chính xác.
Peter Bowers

-2

Điều này phù hợp với tôi: Để gói nội dung của tệp thứ hai thành một hàm, như sau:

firstFile.php

<?php
    include("secondFile.php");

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }

-3

Làm cái này:

$checksum = "my value"; 
header("Location: recordupdated.php?checksum=$checksum");

Mặc dù điều này có thể trả lời câu hỏi nhưng luôn luôn là một ý kiến ​​hay nếu bạn đưa một số văn bản vào câu trả lời để giải thích những gì bạn đang làm. Đọc cách viết một câu trả lời hay .
Jørgen R

Một số lời giải thích sẽ là tuyệt vời.
aton1004
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.