PHP 包含在主文件中无法访问的变量
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 说 none 其中的 none 是在我尝试 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"
这可能不方便或不符合您的预期,但这就是面向对象的工作原理。这就是为什么 "outsource" 变量声明来分隔文件不是一种常见的做法。
相反,您可以 "inject" 如果您确实需要通过将它们移交给 class 的构造函数来将它们分开,那么您可以 "inject"。或者与 class 关联的工厂。
试试这个
<?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() 会阻止 e-warning。你可以将你想要的文件名传递给这个函数,如果你不这样做,函数将使用默认值 "mocks.php"
希望这会有所帮助:-)
我有一个 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 说 none 其中的 none 是在我尝试 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"
这可能不方便或不符合您的预期,但这就是面向对象的工作原理。这就是为什么 "outsource" 变量声明来分隔文件不是一种常见的做法。
相反,您可以 "inject" 如果您确实需要通过将它们移交给 class 的构造函数来将它们分开,那么您可以 "inject"。或者与 class 关联的工厂。
试试这个
<?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() 会阻止 e-warning。你可以将你想要的文件名传递给这个函数,如果你不这样做,函数将使用默认值 "mocks.php" 希望这会有所帮助:-)