Вопрос о переменной области PHP - PullRequest
2 голосов
/ 10 сентября 2010

Согласно руководству PHP $ a должно быть доступно для b.inc в следующем сегменте кода:

<?php
$a = 1;
include 'b.inc';
?>

Однако, когда я пытаюсь сделатьто же самое при вызове статического метода, $ a, кажется, выходит за рамки.

class foo {
    public static function bar() {
        $a = 1;
        include('b.inc');               
    }
}

foo::bar();

Я что-то неправильно понимаю?РЕДАКТИРОВАТЬ: Хорошо, я идиот, все.Я использовал функцию-обертку для включения - для заполнения пути включения.Это вывело переменную из области видимости.Спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 10 сентября 2010

Это полностью работает для меня. Если вы точно описываете проблему, что-то должно происходить с $ a внутри b.inc.

0 голосов
/ 10 сентября 2010

Область действия функции отличается от глобальной области видимости.b.inc будет видеть $ a, а любые переменные, созданные в b.inc, будут находиться в области видимости foo :: bar () (если они не определены как глобальные или внутри их собственной области функций).

Вы можете проверить это с помощью некоторого кода:

function foo() {
    $a = 1;
    include '1.php'; // modify and initialize, ie. $a++; $b = 3; 
    include '2.php'; // test the values: $a == 2; $b == 3
}

Иногда мы сталкиваемся с этой проблемой, когда запускаем WordPress в других сценариях: сценарии инициализации предполагают, что они находятся во внешней области видимости, поэтому они будут устанавливать переменные, такие как $wpdb(объект базы данных), но этот файл фактически будет создан в некоторой функции, которая выполнила require_once().Решение состоит в том, чтобы всегда загружать WordPress в приложении, прежде чем вы попадете в область действия любой функции.

0 голосов
/ 10 сентября 2010
<?php
//a.php
class test
{
    public static function run()
    {
        $a = 'Some value';
        include 'b.php'; //echo $a;
    }
}
test::run();
?>

все отлично работает в моем тесте.

0 голосов
/ 10 сентября 2010

Внутри класса нужно сказать, что вы имеете в виду глобальный.


class foo {
    public static function bar() {
        global $a;
        var_dump($a);
    }
}

foo::bar();
...