2010-10-29 2 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() где-то в моей теме, на экране отображается вывод echo в файле fruit.php, но значения $ var1 и $ var2 не отображаются. Они просто пустые.

Теперь вот странная часть. Если переместить fruits.php в тот же каталог, functions.php, и изменить включает заявление в my_function() к этому:

include 'fruits.php'; 

в 2 переменных отображении только штраф.

Любые идеи, что может вызвать эту проблему?

FYI, я стараюсь, задающая путь к fruits.php в переменной, а затем пытается

include $path; 

безрезультатно.

+0

Это должно сработать. В вашей ситуации есть какая-то дополнительная информация. Код будет включен в вашу функцию, чтобы переменные были доступны. Странно то, что вы добавляете каталог include с wordpress 'stylesheet_directory', который является URL-адресом, а не файловым путем, поэтому он не должен использоваться для включения файлов в PHP. – webbiedave

+0

Спасибо webbiedave. Твоя догадка была прямо. Вместо этого я изменил путь include, чтобы использовать константу STYLESHEETPATH, и теперь он отлично работает. Однако похоже на странное поведение на стороне PHP. В моем исходном коде он включал файл, но он не переносил переменные на него. Почему он будет работать только наполовину? Ну, независимо от того, я буду помнить об этом в будущем. Еще раз спасибо. – mjsiemer

ответ

1

Вы добавляете каталог include с wordpress stylesheet_directory (вместо константы STYLESHEETPATH), который является URL-адресом, а не файловым путем, поэтому он не должен использоваться для включения файлов в PHP. Измените это, чтобы правильно включить файл.

1

Существует проблема здесь с размахом переменных в функции. В основном у вас есть файл, скажем, index.php, в который вы включаете functions.php из другого каталога. В этом functions.php вы определяете две переменные в пределах области действия - это означает, что переменные видны только внутри функции. Кроме того, эта функция включает файл fruits.php.

Поскольку fruits.php технически включен в index.php, он ищет переменные $var1 и $var2 в index.php и они не были определены там, потому что они были определены в пределах области действия функции. В основном он ищет переменные, которые он не видит.

Вот два способа решить эту проблему:

Метод 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

Ваше утверждение 'оно ищет переменные $ var1 и $ var2 в index.php' неверно. Поскольку OP содержит файл внутри функции, он наследует ту же область действия, что и функция. Также вы не можете выполнять назначения вместе с ключевым словом global, как вы пытаетесь сделать в методе 1. Ваш метод 2 гарантирует, что переменные не будут доступны для включенного кода, поскольку они объявлены вне функции. – webbiedave

+0

Что такое OP? Что касается метода 2, я не согласен. Если в 'functions.php' вы объявляете две переменные' $ var1' и '$ var2', а в' index.php' вы выполняете 'require_once (« dir/functions.php »), то две переменные также объявляются в' index.php', и поэтому 'fruit.php' может получить к ним доступ. Сегодня я попробую код для обоих методов, чтобы узнать, дает ли PHP какие-либо ошибки для обоих способов. Я отредактировал ответ, чтобы люди знали, что произошло. – miki725

+0

Спасибо за подробный ответ. Тем не менее, Webbiedave был прав, в своем первоначальном комментарии ко мне. См. Выше. – mjsiemer

Смежные вопросы