Смена класса

N3K

Новичок
Смена класса

PHP:
class c1 
{
protected $_value;
}

class c2 extends c1
{
function getValue()
{
return $this->_value;
}
}
На примере имеется два класса: c1,c2. Имеется объект класса c1. Есть ли возможность перевести его в класс c2, по типу жесткого указания типа данных?
 

N3K

Новичок
У меня нет возможности подставить свой в место c1(Как на примере). А данные закрыты и получить доступ я могу только методами класса.
 

Fortop

Новичок
Брр.
Можно еще раз и по-русски?

Есть сторонний класс? Недоступный для изменения? Что требуется сделать?
 

N3K

Новичок
Требуется из объекта этого класса получить protected данные. Я надеялся создать свой класс, который наследует класс объекта c нужными мне данными и перевести его в мой класс, где реализован метод по получению данных.
 

Fortop

Новичок
Я искренне надеюсь, что автором первого класса, являетесь все же не Вы. Потому что в противном случае надо садиться и переделывать именно первый класс :)

Вариантов, собственно, немного:
1. Создавать изначально объект типа "c2"
2. Использовать рефлексию, для извлечения информации (но это особо хронический случай)
3. Подумать, а зачем собственно потребовались protected данные, которые объект не хочет отдавать? И почему он не хочет их отдавать?
 

N3K

Новичок
Спасибо за ответ ) Сей час буду мучать. А автором первого класса являются разработчики зф(по этому изменять не могу), и подменить класс, как предложено в 1-м варианте не выходит, зф запрещает.
 

N3K

Новичок
проблема поднялась в роутерах. Появилась задача сделать красивые ссылки на довольно большом портале. Использую хелпер url для построения ссылки в виде url(params,router,...). Вот когда я строю ссылку на страницу, указывая в массиве params допустим параметры - param => 5 - ссылка получается нормальная (К примеру /каталог/подкаталог/:id/param/5), как только я перехожу по этому ссылке, начинает использоваться мой роутер, который я указал в хелпере url(да я проверил - именно он). При попытке построить тот же самый урл (К примеру для вывода ссылки на эту страницу) у меня получается ссылка в виде /каталог/подкаталог/:id и любые дополнительные параметры роутер игнорирует. Дебажил некоторое время, перегрузил класс роутера и попытался вывести весь список роутеров. Как оказалось все роутеры хранятся так как я их создал(в виде класса Application_Controller_Router_Route), а вот роутер, который сей час используется автоматически становится Zend_Controller_Router_Route + в нем обрезается пораметр "*", дающий возможность в ссылку доп параметры (выше описаны как массив param => 5) . Т.к. класс он отдает не мой, а в ядро я лезть не собираюсь, я спрашивал у Вас методы, как я могу вытащить параметры роутера для использования их в моем перегруженном хелпере url.
 

Fortop

Новичок
Охохонюшки....

Во-первых, "ссылка" - она. И "По этой ссылке"
Во-вторых, там даже переопределять ничего не надо.
Ну и в третьих, естественно, что если Вы переопределили, и правильно инстанцировали роутер, то будет передаваться именно он.
В крайнем случае у Вас должен был использоваться дефолтный Zend_Controller_Router_Rewrite, а не какой-то Zend_Controller_Router_Route (который является не роутером, у путем - маршрутом)

Ну и рабочий пример
PHP:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    public function _initRouter()
    {
        $router = new Zend_Controller_Router_Rewrite();
        $route = new Zend_Controller_Router_Route(
        'dir/subdir/:id/*',
            array(
                'id'         => 11,
                'controller' => 'user',
                'action'     => 'info'
            )
        );
        $router->addDefaultRoutes();
        $router->addRoute('user', $route);
        Zend_Controller_Front::getInstance()->setRouter($router);
        return $router;
    }
}

class UserController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        echo "<h1>It's me</h1>";
    }

    public function infoAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        echo '<a href="' . $this->view->url(array('id' => 17, 'param' => 5), 'user') . '">sample route User</a>';
        echo '<br>';
        echo '<a href="' . $this->view->url(array('id' => 1777, 'param' => 555), 'default') . '">sample route Default</a>';
    }
}
 

N3K

Новичок
Автор оригинала: Fortop
Охохонюшки....

Во-первых, "ссылка" - она. И "По этой ссылке"
Во-вторых, там даже переопределять ничего не надо.
Ну и в третьих, естественно, что если Вы переопределили, и правильно инстанцировали роутер, то будет передаваться именно он.
В крайнем случае у Вас должен был использоваться дефолтный Zend_Controller_Router_Rewrite, а не какой-то Zend_Controller_Router_Route (который является не роутером, у путем - маршрутом)

Ну и рабочий пример
PHP:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    public function _initRouter()
    {
        $router = new Zend_Controller_Router_Rewrite();
        $route = new Zend_Controller_Router_Route(
        'dir/subdir/:id/*',
            array(
                'id'         => 11,
                'controller' => 'user',
                'action'     => 'info'
            )
        );
        $router->addDefaultRoutes();
        $router->addRoute('user', $route);
        Zend_Controller_Front::getInstance()->setRouter($router);
        return $router;
    }
}

class UserController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        echo "<h1>It's me</h1>";
    }

    public function infoAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        echo '<a href="' . $this->view->url(array('id' => 17, 'param' => 5), 'user') . '">sample route User</a>';
        echo '<br>';
        echo '<a href="' . $this->view->url(array('id' => 1777, 'param' => 555), 'default') . '">sample route Default</a>';
    }
}
Во-первых, "ссылка" - она. И "По этой ссылке"
Извиняюсь, опечатался.
Во-вторых, там даже переопределять ничего не надо.
Переопределял я для дебага. Вот как выглядит переопределенный класс:
PHP:
<?php
require_once 'Zend/Controller/Router/Route.php';
class Application_Controller_Router_Route extends Zend_Controller_Router_Route
{
}
Попытаюсь обьяснить саму проблему с вырезками:
Все пути создаются используя класс Application_Controller_Router_Route. Так вот путь, который зф выбрал использует в данный момент переделывается в Zend_Controller_Router_Route, все остальные остаются Application_Controller_Router_Route. Увидел я это выводя дампом мой класс роутеров (class Router extends Zend_Controller_Router_Rewrite) где создаю все пути на разных страницах.
 

Splurov

Новичок
И какое protected свойство из Zend_Controller_Router_Route ты хочешь получить и что потом с ним делать будешь?
Если не сработало твоё ожидаемое правило, может просто маршрут неверно указан и срабатывает правило по-умоланию?
 

Fortop

Новичок
N3K
Я дал пример кода, который решает задачу вывести ссылку вида
/каталог/подкаталог/:id/param/5
Точно так же можно добавить и несколько десятков других роутов. Определять собственный класс абсолютно не нужно.

Так вот путь, который зф выбрал использует в данный момент переделывается в Zend_Controller_Router_Route, все остальные остаются Application_Controller_Router_Route
Мысль не понята. Приведите что ли уже пример дампа и желательно стектрейс. Чтобы было немного понятнее о чем идет речь

Попутно хотелось бы увидеть строку вызова Вашего urlHelper с параметрами и результат его работы (урлы)
 
Сверху