ФорумПрограммированиеPHP для идиотов → какая-то проблема с магией (или со мной)

какая-то проблема с магией (или со мной)

  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 25 декабря 2010 г. 17:31

    наблюдаю непонятное явление

    $this->view->$template = 'default.tpl';
    var_dump($this->view->$template);

    этот код вызывается в контролере, выводит Fatal error: Cannot access empty property in X:\home\dev\www\application\controllers\DefaultController.php on line 7, хотя по идее должно выводить default.php

    классы

    <?php
    class View{
    public $template = null;
    public $layout = null;
    protected $_obj = null;

    public function __construct($template = null, $layout = null) {
    $this->template = $template;
    $this->layout = $layout;
    $lib = Config::get('tpl.lib');

    $this->_obj = new $lib;
    }

    public function __call($method, $params) {
    call_user_func_array(array($this->_obj, $method), $params);
    }

    public function __set($name, $value) {
    $this->_obj->assign($name, $value);
    }
    }
    ?>


    <?php
    abstract class Controller implements ControllerInterface{

    public $request = null;
    protected $_view = null;

    //это как бы ленивая инициализация
    public function __get($name) {
    if ($name == 'view') {
    if (is_null($this->view)) {
    $this->_view = new View();
    }
    return $this->_view;
    }
    }
    }
    ?>

    задача кода - экземпляр класса въюхи создается во время первого обращения к $this->view из контроллера.
    $this->view->template = 'название шаблона' - один из вариантов указать из контролера вьюхе какой шаблон надо будет рендерить
    во View::$_obj хранится экземпляр класса шаблонизатора

    весь лишний код урезал, в чем моя ошибка?
  • Mars

    Сообщения: 304 Репутация: N Группа: Кто попало

    Spritz 25 декабря 2010 г. 17:35, спустя 3 минуты 21 секунду

    Проблемы с магией говоришь?


  • master

    Сообщения: 3242 Репутация: N Группа: Джедаи

    Spritz 26 декабря 2010 г. 1:21, спустя 7 часов 46 минут 38 секунд

    $this->view->$template
    $this->view->template
    не всё полезно, что в swap полезло
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 26 декабря 2010 г. 5:01, спустя 3 часа 39 минут 52 секунды


    $this->view->$template
    $this->view->template


    так в начале и было. но свойство $template не изменяет и ошибок не выдвает
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 декабря 2010 г. 5:18, спустя 17 минут 1 секунду

    public $template = null;

    для public'ов __get не сработает
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 26 декабря 2010 г. 5:23, спустя 5 минут 6 секунд


    public $template = null;

    для public'ов __get не сработает


    __get для cвойста view, должно работать. view объект возвращает и мы присваеваем значение переменно
    Спустя 102 сек.

    public $template = null;

    для public'ов __get не сработает


    __get для cвойста view, должно работать. view объект возвращает и мы присваеваем значение переменной template для возвращенного нам объекта view
  • newmindcore

    Сообщения: 10 Репутация: N Группа: Кто попало

    Spritz 31 декабря 2010 г. 5:45, спустя 5 дней 22 минуты

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


    <?php

    class A
    {
    public $foo = 'bar';
    protected $attrs = array(
    'updateable' => 'true',
    'selectable' => 'false',
    );

    public function __get($name)
    {
    if (array_key_exists($name, $this->attrs))
    return $this->attrs[$name];
    else echo 'Raise Exception: No attribute named ' . $name;
    }

    public function __set($name, $value)
    {
    if (array_key_exists($name, $this->attrs))
    $this->attrs[$name] = $value;
    else echo 'Raise Exception: No attribute named ' . $name;
    }

    }

    $a = new A();
    echo $a->foo;
    // returns 'bar'
    echo $a->updateable;
    // return true
    $a->selectable = 'true';
    echo $a->selectable;
    // return true
    echo $a->insertable;
    // return 'Raise Exception: No attribute named insertable'

    ?>
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 1 января 2011 г. 5:19, спустя 23 часа 33 минуты 15 секунд


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


    <?php

    class A
    {
    public $foo = 'bar';
    protected $attrs = array(
    'updateable' => 'true',
    'selectable' => 'false',
    );

    public function __get($name)
    {
    if (array_key_exists($name, $this->attrs))
    return $this->attrs[$name];
    else echo 'Raise Exception: No attribute named ' . $name;
    }

    public function __set($name, $value)
    {
    if (array_key_exists($name, $this->attrs))
    $this->attrs[$name] = $value;
    else echo 'Raise Exception: No attribute named ' . $name;
    }

    }

    $a = new A();
    echo $a->foo;
    // returns 'bar'
    echo $a->updateable;
    // return true
    $a->selectable = 'true';
    echo $a->selectable;
    // return true
    echo $a->insertable;
    // return 'Raise Exception: No attribute named insertable'

    ?>



    если бы ты хоть намного посмотрел на мой код, ты бы понял, что метод __get перехватывает обращение к несуществующему свойству view, и передает свойству _view

Пожалуйста, авторизуйтесь, чтобы написать комментарий!