2012-05-18 15 views
5

Tôi đang cố gắng nhập một số biến từ một tập lệnh PHP. Nó có vẻ đơn giản nhưng tôi không thể làm cho nó hoạt động được.Truy cập các biến toàn cầu trong một tập lệnh PHP riêng biệt?

Các kịch bản có chứa một số biến toàn cục như thế:

$server_hostname = "localhost"; 
$server_database = "kimai"; 
$server_username = "root"; 
$server_password = ""; 
$server_conn  = "mysql"; 
$server_type  = ""; 
$server_prefix = "kimai_"; 
$language  = "en"; 
$password_salt = "7c0wFhYHHnK5hJsNI9Coo"; 

Sau đó, trong kịch bản của tôi, tôi muốn truy cập các biến này, vì vậy tôi đã thực hiện:

require_once 'includes/autoconf.php'; 
var_dump($server_hostname); 

Nhưng điều này chỉ là kết quả đầu ra VÔ GIÁ TRỊ. Tôi cũng đã thử:

require_once 'includes/autoconf.php'; 

global $server_hostname;  
var_dump($server_hostname); 

nhưng vẫn không hoạt động.

Tôi đã thêm một số câu lệnh echo vào tệp "autoconf.php" để tôi biết rằng tệp đang được tải.

Bất kỳ ý tưởng nào về cách tôi có thể truy cập các biến này?

+0

Nếu chúng được xác định trong một hàm thì nó sẽ là riêng tư đối với hàm đó. Ngay cả khi bạn sử dụng toàn cầu ở nơi khác – IEnumerable

+0

Chúng không có chức năng. Mã tôi đăng là mã hoàn chỉnh. –

+0

bạn có bất kỳ lỗi nào khác ngoại trừ việc biến đó dường như không có trong không gian tên không? kích hoạt đầu ra lỗi nếu các lỗi bị ẩn. –

Trả lời

2

Nó chỉ ra các tập tin đã được bao gồm ở một nơi khác trong ứng dụng vì vậy khi tôi được gọi require_once, các tập tin đã không được bao gồm cả. Tôi đã đổi nó thành chỉ require và bây giờ nó hoạt động.

2

Bạn phải xác định các biến như toàn cầu đầu tiên:

global $server_hostname; 
$server_hostname = "localhost"; 
+1

Nhưng dù sao, tôi không nghĩ rằng điều này là cần thiết nếu bạn sau này làm một inlude hoặc yêu cầu, nó sẽ hoạt động giống như bạn đã thử. – djot

+1

Sự hiểu biết của tôi là các biến được khai báo bên ngoài bất kỳ hàm hoặc khối nào đã có trong phạm vi toàn cục (http://php.net/manual/en/language.variables.scope.php) Ngoài ra tôi không thể sửa đổi tập lệnh này trực tiếp vì vậy tôi cần để truy cập các biến theo cách khác. –

+0

Chúng nằm trong phạm vi toàn cục nhưng trong các tệp hoặc hàm khác bạn cần phải thêm toàn cầu $ varname; – IEnumerable

1

Có lẽ tập tin đã không được đưa đúng cách.

require_once 'includes/autoconf.php'; 

kiểm tra thư mục làm việc hiện tại nơi bạn bao gồm autoconf.php

thử này

if (file_exists('includes/autoconf.php')) require_once 'includes/autoconf.php'; 
else echo 'File not exists'; 

để kiểm tra xem nó ra.

0

Làm thế nào để sử dụng hằng số?

xác định ("server_hostname", "localhost"); xác định ("server_hostname", "localhost");

+0

Tôi không thể thay đổi mã trong tệp autoconf.php này. Tất nhiên, nếu tôi có thể tôi chỉ đơn giản là tránh sử dụng bất kỳ biến toàn cầu nào cả. –

+0

TRUE nhưng không phải là một hằng số, không thay đổi – IEnumerable

+1

đó là ngữ nghĩa anyway. Thực tế là một biến không được tải, nó có nghĩa là hằng số cũng sẽ không được nạp. Là một vấn đề tải. –

0

Nếu bạn bao gồm các tập tin và các biến là trong một văn bản đơn giản, và không bên trong một hàm/lớp nó hoạt động mà không có sự toàn cầu

Đến php.ini của bạn và đặt display_errors = On và lỗi để E_ALL nên bạn sẽ thấy đó là lý do chính xác

0

Đây là điều ác, nhưng nó có thể hoàn thành công việc.

<? //PHP 5.4+ 
\call_user_func(static function(){ 
    $globals = \get_defined_vars(); 
    include 'includes/autoconf.php'; 
    $newVars = \array_diff_key($globals, \get_defined_vars()); 
    foreach($newVars as $name => $value){ 
     \define($name, $value); 
    } 
}); 
//Variables defined in file are now constants! 
?>