Проблема с доступом к глобальной переменной в PHP

Следующее является фрагментом кода:

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

5
задан CodeTweetie 18 February 2010 в 18:51
поделиться

6 ответов

$ flag = 4; не входит в глобальную область видимости.

Если включение происходит внутри функции в вызывающем файле, то весь код, содержащийся в вызываемом файле, будет вести себя так, как если бы он был определен внутри этой функции.

- Страница руководства PHP для include , которая также применяется для include_once, require и require_once

Я собираюсь предположить, что ошибка, которую вы получаете, связана с if ($ flag) , потому что в этот момент $ flag не инициализирован, потому что глобальной переменной $ flag никогда не было присвоено значение.

Между прочим, echo 'global scope flag ='. $ Flag; также не отображает глобальный флаг, так как вам нужен global $ flag; в этой функции для отображения глобальная копия, которая также имеет побочный эффект, заставляющий $ flag = 4; влиять на глобальную копию во включенном файле.

2
ответ дан 13 December 2019 в 19:26
поделиться

Строка, которая, вероятно, вызывает у вас проблемы, вот эта: echo 'global scope flag'=$flag;

Измените ее на: echo 'global scope flag = '.$flag;

Изменить: Теперь, когда вы отредактировали свой фрагмент кода, обернув его в функцию something(), проблема стала более понятной. Я думаю, что здесь происходит то, что когда вы инициализируете $flag с помощью $flag = 4;, его область видимости находится внутри метода something().

Попробуйте поместить $flag = 4; выше/перед строкой function something() {. Тогда все будет в порядке с миром.

2
ответ дан 13 December 2019 в 19:26
поделиться

Не должно echo 'флаг глобальной области' = $ flag; быть echo 'флаг глобальной области ='. $ flag;

Я получил другую ошибку. Это помогло мне быстро решить проблему.

Ошибка синтаксического анализа: ошибка синтаксического анализа, непредвиденный '=', ожидание ',' или ';' в D: \ Websites (Apache) \ Test Site1 \ test.php в строке 6

0
ответ дан 13 December 2019 в 19:26
поделиться

В цикле из 150 000 записей вы можете просто остановить его в любом количестве, которое вы считаете подходящим. Задайте переменную счетчика и при каждом попадании в цикл просто < cfabort > или < cfbreak > .

-121--4859413-

С помощью Linq2SQL можно использовать все хранимые процедуры/функции, созданные для решения. Используя что-то вроде стратегий, выраженных в работе с кодом Legacy Code Micheal Feather, можно создавать границы вокруг областей приложения и обновлять их в пределах этих границ.

Стратегия, которую я использовал в прошлом, заключается в ведении/игнорировании базы данных и ее объектов. Затем я медленно повторяю различные вызовы ADO и заменяю Linq2SQL вызовами до тех пор, пока все приложение не будет использовать Linq2SQL. Затем мне легче преобразовать предыдущие вызовы ADO, которые были представлены и переданы DataSets/DataTables, в более подходящие сущности.

Другой подход (для тяжелых решений DataSet/DataTable) заключается в том, чтобы поддерживать вызовы ADO на месте и вместо этого использовать методы расширения AsQueryable () и/или OfType < T > () для преобразования предметов ds/dt в соответствующие объекты, затем агрегиссируйте эти изменения.

-121--4435021-

Просто сделайте следующее:

$myFlag = getFlag(); 
echo $myFlag; // output: whatever


// test.php 

$flag = 'whatever'; 

function getFlag(){
    global $flag;   
    return $flag; 
}

Я бы никогда не стал задавать переменную в одном сценарии и вызывать ее из другого файла. это вызовет крайнюю путаницу по дороге. Даже мое решение не лучшее. Я бы сделал это как полный класс с/в идеале.

0
ответ дан 13 December 2019 в 19:26
поделиться

Поскольку на ваш исходный вопрос уже был дан ответ, позвольте мне предложить другой подход, который полностью избегает глобальных переменных.
Похоже, у вас есть функция + значение по умолчанию, которое вы задали как глобальную переменную. Вы также можете определить значения по умолчанию для параметров функции .

<?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 ). Но опять же: у меня нет никаких доказательств этого, просто догадка. По крайней мере, это дает вашему коду шанс «изящно» обработать ошибку.

0
ответ дан 13 December 2019 в 19:26
поделиться

Вы столкнулись с проблемой здесь просто из-за того, как 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;
7
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: