Следующее является фрагментом кода:
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
require_once ($include_file);
// global $flag;
// echo 'in main global scope flag='.$flag;
test();
}
}
something();
exit;
//in test.php
$flag = 4;
function test() {
global $flag;
echo '<br/>in test flag="'.$flag.'"';
if ($flag) {
echo 'flag works';
//do something
}
}
Вышеупомянутый фрагмент кода, повторяет значение $flag 'глобальной области видимости' правильно, но не делает распознает $flag со значением 4, принимает нулевое значение за $flag. Укажите что не так в доступе к той глобальной переменной $flag.
Заранее спасибо, Anitha
$ flag = 4;
не входит в глобальную область видимости.
Если включение происходит внутри функции в вызывающем файле, то весь код, содержащийся в вызываемом файле, будет вести себя так, как если бы он был определен внутри этой функции.
- Страница руководства PHP для include , которая также применяется для include_once, require и require_once
Я собираюсь предположить, что ошибка, которую вы получаете, связана с if ($ flag)
, потому что в этот момент $ flag не инициализирован, потому что глобальной переменной $ flag никогда не было присвоено значение.
Между прочим, echo 'global scope flag ='. $ Flag;
также не отображает глобальный флаг, так как вам нужен global $ flag;
в этой функции для отображения глобальная копия, которая также имеет побочный эффект, заставляющий $ flag = 4;
влиять на глобальную копию во включенном файле.
Строка, которая, вероятно, вызывает у вас проблемы, вот эта: echo 'global scope flag'=$flag;
Измените ее на: echo 'global scope flag = '.$flag;
Изменить:
Теперь, когда вы отредактировали свой фрагмент кода, обернув его в функцию something()
, проблема стала более понятной. Я думаю, что здесь происходит то, что когда вы инициализируете $flag с помощью $flag = 4;
, его область видимости находится внутри метода something()
.
Попробуйте поместить $flag = 4;
выше/перед строкой function something() {
. Тогда все будет в порядке с миром.
Не должно echo 'флаг глобальной области' = $ flag;
быть echo 'флаг глобальной области ='. $ flag;
Я получил другую ошибку. Это помогло мне быстро решить проблему.
Ошибка синтаксического анализа: ошибка синтаксического анализа, непредвиденный '=', ожидание ',' или ';' в D: \ Websites (Apache) \ Test Site1 \ test.php в строке 6
В цикле из 150 000 записей вы можете просто остановить его в любом количестве, которое вы считаете подходящим. Задайте переменную счетчика и при каждом попадании в цикл просто < cfabort >
или < cfbreak >
.
С помощью Linq2SQL можно использовать все хранимые процедуры/функции, созданные для решения. Используя что-то вроде стратегий, выраженных в работе с кодом Legacy Code
Micheal Feather, можно создавать границы вокруг областей приложения и обновлять их в пределах этих границ.
Стратегия, которую я использовал в прошлом, заключается в ведении/игнорировании базы данных и ее объектов. Затем я медленно повторяю различные вызовы ADO и заменяю Linq2SQL вызовами до тех пор, пока все приложение не будет использовать Linq2SQL. Затем мне легче преобразовать предыдущие вызовы ADO, которые были представлены и переданы DataSets/DataTables, в более подходящие сущности.
Другой подход (для тяжелых решений DataSet/DataTable) заключается в том, чтобы поддерживать вызовы ADO на месте и вместо этого использовать методы расширения AsQueryable ()
и/или OfType < T > ()
для преобразования предметов ds/dt в соответствующие объекты, затем агрегиссируйте эти изменения.
Просто сделайте следующее:
$myFlag = getFlag();
echo $myFlag; // output: whatever
// test.php
$flag = 'whatever';
function getFlag(){
global $flag;
return $flag;
}
Я бы никогда не стал задавать переменную в одном сценарии и вызывать ее из другого файла. это вызовет крайнюю путаницу по дороге. Даже мое решение не лучшее. Я бы сделал это как полный класс с/в идеале.
Поскольку на ваш исходный вопрос уже был дан ответ, позвольте мне предложить другой подход, который полностью избегает глобальных переменных.
Похоже, у вас есть функция + значение по умолчанию, которое вы задали как глобальную переменную. Вы также можете определить значения по умолчанию для параметров функции .
<?php // test.php
function test($flags=4) {
echo '<br/>in test flag="'.$flags.'"';
if ($flags!=0) {
echo ' flag works';
}
}
Нет глобальной переменной, но вы все равно можете вызвать test () без параметра, и функция будет использовать значение по умолчанию, которое вы можете перезаписать, передав параметр.
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
require_once ($include_file);
echo "\nwithout parameter: "; test();
echo "\nwith a parameter: "; test(16);
}
}
something();
exit;
печатает
without parameter: <br/>in test flag="4" flag works
with a parameter: <br/>in test flag="16" flag works
Это не точно такое же поведение, но может быть то, что вы хотели в первую очередь ....
править: Другой момент может быть
if ( file_exists($include_file) ) {
require_once ($include_file);
конструкция, которую вы используете. У меня нет твердого мнения (или каких-либо веских доказательств ;-)) по этому поводу, но вы можете вместо этого рассмотреть возможность использования
$something = include $include_file;
if ( false!==$something ) { /* error handling here... */ }
. include "возвращает" false, если php не может включить файл. Все, что требуется для этого, - это то, что включенный файл явно не возвращает FALSE. Этот может быть более дружественным к кешированию (например, при использовании чего-то вроде APC ). Но опять же: у меня нет никаких доказательств этого, просто догадка. По крайней мере, это дает вашему коду шанс «изящно» обработать ошибку.
Вы столкнулись с проблемой здесь просто из-за того, как PHP в настоящее время интерпретирует ваш файл. У вас есть вложенные функции.
Вот как ваш код в настоящее время выполняется:
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
//require_once ($include_file);
$flag = 4;
function test() {
global $flag;
echo '<br/>in test flag="'.$flag.'"';
if ($flag) {
echo 'flag works';
//do something
}
}
//end require_once ($include_file);
test();
}
}
something();
exit;
Как видите, когда вы присваиваете значение 4
$ flag
( $ flag = 4
), вы находитесь в области действия функции something ()
, а не в глобальной области видимости.
В test ()
, поскольку вы объявляете $ flag
как глобальный внутри этой функции, $ flag
- это совершенно другая переменная, глобальная для всего скрипта. .
Чтобы избежать этой проблемы, используйте суперглобальный $ GLOBALS
. В любом случае это быстрее, чем использование global
, и таким образом вы не попадете в проблемы с областью видимости, как указано выше:
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
//require_once ($include_file);
$GLOBALS['flag'] = 4;
function test() {
global $flag;
echo '<br/>in test flag="'.$GLOBALS['flag'].'"';
if ($GLOBALS['flag']) {
echo 'flag works';
//do something
}
}
//end require_once ($include_file);
test();
}
}
something();
echo $flag; //echos 4
exit;