2010-10-29 48 views
0

因此,我有一个WordPress主题。变量不会包含在不同的目录中

在functions.php文件,我正在写,看起来像这样的功能:

function my_function(){ 
    $var1 = 'apple'; 
    $var2 = 'orange'; 
    include get_bloginfo('stylesheet_directory').'/lib/fruits.php'; 
} 

而且fruits.php文件看起来像这样:

<?php 

echo "My brother's favorite fruit is an $var1, but my favorite fruit is an $var2."; 

?> 

当我打电话my_function()在我的主题中的某处,fruit.php中的echo语句显示在屏幕上,但$ var1和$ var2的值不显示。他们只是空白。

现在这里是奇怪的部分。如果我移动到fruits.php同一目录下的functions.php,并更改包括创建my_function()语句是:

include 'fruits.php'; 

2个变量显示就好了。

任何想法可能会导致此问题?

仅供参考,我也尝试定义路径的变量fruits.php然后试图

include $path; 

无济于事。

+0

这应该工作。您的情况中还缺少一些其他信息。代码将包含在你的函数中,这样变量就可以被访问。奇怪的是,你预先在include目录中加入了wordpress'stylesheet_directory'这是一个URL,而不是一个文件路径,因此它不应该被用来在PHP中包含文件。 – webbiedave 2010-10-29 06:34:05

+0

谢谢webbiedave。你的直觉是对的。我将包含路径改为使用常量STYLESHEETPATH,而现在它完美地工作。虽然,似乎PHP的部分奇怪的行为。在我原来的代码中,它确实包含了该文件,但它不会将变量传递给它。为什么只能这样工作呢?那么,无论如何,我将来都会记住这一点。再次感谢。 – mjsiemer 2010-10-29 16:12:40

回答

1

您正在预先考虑包含wordpress的目录stylesheet_directory(而不是STYLESHEETPATH常量),这是一个URL,而不是一个文件路径,因此它不应该用于包含PHP中的文件。将其更改为正确包含该文件。

1

这里有与该函数的变量范围的问题。基本上你有一个文件,可以说index.php其中你包括从其他目录functions.php。在那个functions.php中,你可以在一个函数范围内定义两个变量 - 这意味着变量只在函数中可见。此外,该功能还包括fruits.php文件。

由于fruits.php在技术上是index.php包括在内,它会寻找变量$var1和内index.php$var2,他们尚未确定那里,因为它们是在功能的范围内确定。基本上它寻找一个它看不到的变量。

这里有两种方法来解决这个问题:

方法1:

修改功能如下。

function my_function(){ 
    global $var1 = 'apple'; 
    global $var2 = 'orange'; 
    include get_bloginfo('stylesheet_directory').'/lib/fruits.php'; 
} 

这样你迫使变量没有在函数中是可见的,但是是全球性的,或者换句话说,是整个文件中可见。

方法2:

定义功能以外的变量。

$var1 = 'apple'; 
$var2 = 'orange'; 
function my_function(){ 
    include get_bloginfo('stylesheet_directory').'/lib/fruits.php'; 
} 

有关变量的作用域的更多信息,你可以去这里http://php.net/manual/en/language.variables.scope.php

希望这有助于。

+0

你的声明'它在index.php中寻找变量$ var1和$ var2'是不正确的。由于OP在函数中包含文件,因此它继承与函数相同的范围。另外,您不能像方法1中那样执行全局关键字的分配。您的方法2将确保变量不会被包含的代码访问,因为它们在函数之外声明。 – webbiedave 2010-10-29 06:36:27

+0

什么是OP?关于方法2,我不同意。如果在'functions.php'中声明了两个变量'$ var1'和'$ var2',在'index.php'中声明了'require_once(“dir/functions.php”)'',那么这两个变量也在' index.php'因此'fruits.php'可以访问它们。我今天将尝试使用这两种方法的代码,以查看PHP是否为这两种方式提供了任何错误。生病编辑答案让人们知道发生了什么。 – miki725 2010-10-29 11:55:31

+0

感谢您的详细解答。尽管如此,Webbiedave在他对我的原始评论中是正确的。请参阅上文。 – mjsiemer 2010-10-29 16:13:33