LINUX.ORG.RU

[PHP] Глобальная доступность переменных


0

1

Переменная testVariable при вызове test() будет неинициализированная.

Как это обойти ?

<?php

class BaseClass {
    private $data = array();
    protected  function __set($name,$variable){
        $this->data[$name] = $variable;

    }
    protected  function __get($name){
        return $this->data[$name];

    }
}
<?php

require_once 'BaseClass.php';
class TestClass extends BaseClass {

    public function index(){
        $this->testVariable = "12345";
        echo $this->testVariable; //Тут доступно

    }
    public function test(){
        echo $this->testVariable; //Недоступно
    }

}
<?php
require_once 'TestClass.php';
$app = new TestClass();
if ($_SERVER['QUERY_STRING'] == '1') {
    $app->index();
} else
    $app->test();

Переменная testVariable при вызове test() будет неинициализированная.

А ты какого поведения ожидал? Не описал, не проинициализировал — вот и нет переменной. Что не так?

KRoN73 ★★★★★ ()
Ответ на: комментарий от neoxgeforce

Я хочу чтобы она была доступна

Как доступна? Она у тебя на момент вызова ничем не инициализирована. Хочешь, чтобы просто NOTICE не было? Опиши в классе переменную:

class BaseClass {
    var $testVariable;
    // ...
}

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

У меня есть FrontController который создает новый обьект каждый раз при входящем запросе.(К примеру «/login/index» или «login/test»)

$className = $controller . 'Controller';
$function = $action . 'Action';
$object = new $className();
$object->$function();
И тестовый класс.
<?php
class loginController extends Core_BaseController
{

    function indexAction()
    {
        $session = createSession();
        $this->session = $session;
    }

    function testAction()
    {       
        var_dump($this->session); // Нет значения

    }
}
При повторном запросе будет опять создаваться уже НОВЫЙ обьект и в нем не будет инициализированная переменная. А мне нужно чтобы значение было (ну конечно при условии что я перед этим вызывал indexAction).

Я понимаю что php-интерпретатор будет заново обрабатывать код и глупо надеяться что переменная будет установлена. Как можно обойти это ограничение ?

neoxgeforce ()

Она доступна. PHP скрипты - это не fast cgi и прочее, что сидит в памяти и обрабатывает кучу запросов. Каждый запрос выполняется в изолированной среде. Программировать следует исходя из того, что на каждый запрос программа будет снова выполняться с нуля.

helios ★★★★★ ()
Ответ на: комментарий от neoxgeforce

Нужно использовать какое-нибудь хранилище и обращаться к нему во время запросов. Это может быть база данных, куки.

helios ★★★★★ ()
Ответ на: комментарий от neoxgeforce

Как можно обойти это ограничение ?

PHP может сериализовать объекты. Но нужно быть осторожным, будет много подводных камней.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Спасибо. Мне это пригодится. Я переделал свой класс для работы с сессиями.

neoxgeforce ()
Ответ на: комментарий от neoxgeforce

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

pba ()

Основываясь на стиле ОПа могу предложить только вызвать $this->index() из test();

В следующей серии ОП узнает, как вызвать библиотечный метод другого класса (например, исключительно библиотечного), или обратиться к его справочным свойствам.

GateKeeper ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.