[英]PHP included variables not accessible in main file
我有一個main.php文件,通過它可以運行某些功能。 當我包含另一個只定義了一堆變量的文件時,我無法訪問main.php文件中的那些變量。
main.php的示例:
class MyMain {
public function include_mocks() {
return include 'mocks.php';
}
public function use_mocks() {
$included = $this->include_mocks();
if($included == true) {
print_r($mock1); die();
}
}
}
包含文件的mocks.php的示例:
<?php
$mock1 = array(
'key1' => 'some data',
'key2' => 'other data'
);
這個包含的文件中包含幾個模擬,我希望能夠將這些模擬用作main.php中的變量。 出於某種原因,它拋出500,表示在包含之后我嘗試對它們進行print_r()處理后,這些都沒有定義。
這里的問題是,您試圖在一個方法的范圍內定義這些函數,同時嘗試在另一方法的范圍內訪問它們。 那是兩件事。
為了達到這個目的,你必須要么宣布在全球范圍內(認為是不好的做法)的變量,或將其存儲在對象的屬性里面。
考慮以下示例:
<?php
$varInGlobal = "I am defined globally";
class myClass {
private $varInClass = "I am defined in the class";
private $varFromFile;
function __construct() {
require 'includeVar.php';
$this->varFromFile = $varInFile;
echo "## in constructor: \n";
var_dump($varInFile);
}
function showMyVars() {
echo "** in class: \n";
var_dump($varInClass);
var_dump($this->varInClass);
echo "** in global: \n";
var_dump($varInGlobal);
var_dump($GLOBALS['varInGlobal']);
echo "** in file: \n";
var_dump($varInFile);
var_dump($GLOBALS['varInFile']);
echo "** in property: \n";
var_dump($this->varFromFile);
}
}
$obj = new myClass;
$obj->showMyVars();
包含的文件includeVar.php
:
<?php
$varInFile = "I am defined externally";
輸出為:
## in constructor:
string(23) "I am defined externally"
** in class:
NULL
string(25) "I am defined in the class"
** in global:
NULL
string(21) "I am defined globally"
** in file:
NULL
NULL
** in property:
string(23) "I am defined externally"
這可能不方便或您沒有期望,但這就是面向對象的工作方式。 這就是為什么將變量聲明“外包”到單獨的文件中並不常見的原因。
相反,如果確實需要通過將它們移交給類的構造函數來使其分離,則可以“注入”此類變量。 或與該類相關的工廠。
嘗試這個
<?php
Class MyMain
{
public function use_mocks($filename = 'mocks.php')
{
if(file_exists($filename))
{
if(include($filename))
{
print_r($mock1);
}
}
die;
}
}
$asd = new MyMain();
$asd->use_mocks();
?>
當$ filename不存在時,file_exists()阻止電子警告。 您可以將所需的文件名傳遞給該函數,如果不使用該函數,則將使用默認值“ mocks.php”。希望這會有所幫助:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.