2016-01-07 45 views
1

我有一個main.php文件,我正在運行某些功能。當我包含另一個文件,其中有一堆定義的變量時,我無法訪問我的main.php文件中的變量。 main.php的PHP包含主文件中無法訪問的變量

例:包括文件mocks.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(); 
     } 
    } 
} 

例子:

<?php 

$mock1 = array(
    'key1' => 'some data', 
    'key2' => 'other data' 
); 

這包括文件有幾個嘲笑它,我希望能夠用這些模擬考試作爲我的main.php中的變量。由於某種原因,它給我一個500說,這些都沒有定義後,我嘗試print_r()他們後包括。

+0

突然嘗試用'require'而不是'include' –

+0

有一點需要注意的是'include'返回false或1(取決於它是否成功)而不是包含文件的內容。不知道這是你的意圖。 – Yumecosmos

+0

@Yumecosmos nope,只是想讓它們包含在文件中!至少我現在已經找到了一個解決方法! – Exziled

回答

2

這裏的問題是您在一個方法的範圍內定義這些函數,同時嘗試在另一個方法的範圍內訪問它們。這是兩件獨立的事情。

要完成這樣的事情,您必須要麼在全局範圍聲明該變量(被認爲是不好的做法),要麼將其存儲在對象屬性中。

考慮這個例子:

<?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" 

這可能不是很方便或您所期望的,但這是如何面向對象的作品。這就是爲什麼將變量聲明「外包」爲單獨文件並不常見的做法。

相反,如果你真的必須通過把它們交給你的類的構造函數來分開它們,你可以「注入」這些變量。或者到與該班級相關的工廠。

0

試試這個

<?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(); 

?> 

file_exists()防止在$ filename不存在的e-警告。你可以傳遞給你想要的文件名,如果你不使用默認值「mocks.php」 希望這有助於:-)

+0

所以你說要實例化包含文件的類,然後通過$ asd-> varName訪問屬性; ?? – Exziled

+0

您必須初始化MyMain類,如果您不想創建MyMain的實例,則必須將該函數設置爲靜態'public static function use_mocks($ filename ='mocks.php){code}'並調用函數使用::而不是 - >'MyMain :: use_mocks();' –