Доступ к static protected свойству в php

542
01 января 2017, 20:24

Есть базовый класс View, в котором лежит protected static свойство:

<?php
namespace core;
/**
* Class View 
* @category View class
* @package core
* <pre>
* Описывает контракт представления (View) для приложения.
* </pre>
*/
class View
{
#region Public Static members
protected static $VIEWS_SUB_FOLDERS = array(
    'authorization' => "authorization",
    'admin' => "admin",
    'info_pages' => "info_pages"
);
#endregion
//public $template_view; //здесь можно указать общий вид по умолчанию.
/**
 * @param $content_view виды отображающие контент страниц;
 * @param $template_view общий для всех страниц шаблон;
 * @param null $data массив, содержащий элементы контента страницы. Обычно заполняется в модели.
 */
function generate($content_view, $template_view, $data = null)
{
    include 'application/views/templates/' . $template_view;
}
}
?>

Как мне получить это свойство в этом классе (см. метод action_index())??:

<?php
namespace core\controllers;
use core as c;
use core\models as cm;
/**
* Class Controller_AboutUs
* @package core\controllers
* @category Controllers category
* @author Mazur Alexandr
*/
class Controller_AboutUs extends c\Controller
{
/**
 * Controller_AboutUs constructor.
 * <pre>
 * Инициализирует свойства model и view
 * </pre>
 */
public function __construct()
{
    $this->model = new cm\Model_AboutUs;
    $this->view = new c\View();
}
/**
 * @access public
 * @return void
 * <pre>
 * Рендерит страницу "О нас" (AboutUs)
 * </pre>
 */
public function action_index()
{
    //$this->view-> так доступ к статическому свойству не получить
    //$this->view:: так тоже
    //View:: тоже не то, свойство же protected
    //А как тогда???
    //$this->view->generate("", "");
}
}

p.s. есть ли смысл так записывать аннотации в php (не смотря на русский язык в них)?

Answer 1

канонический ответ - никак, на то оно и protected; но когда нельзя, но очень хочется...

1 - ломать в лоб, через Reflection (грязно, нечестно, но работает)

http://stackoverflow.com/questions/6448551/is-there-any-way-to-set-a-private-protected-static-property-using-reflection-cla

2 - хитрить аккуратнее - наследовать новый класс от View, и в новом классе сделать прокси для свойства (вроде public методов get_this_protcted_field_value() /set_this_protcted_field_value() ), и соответственно в конструкторе контроллера создавать экземпляр собственной вьюхи с "бэкдорами".

3 - ну, вариант "сделать его публичным" не предлагаю, т.к. полагаю, что автор адекватен и у него есть причины, по которым он так сделать не может :)

READ ALSO
AES Python &lt;-&gt; PHP (Chris Veness) [требует правки]

AES Python <-> PHP (Chris Veness) [требует правки]

Здравствуйте, существует класс для шифрования/дешифрования по алгоритму AES от Chris VenessНа всякий случай привиду конкретные файлы php: AES

531
Безопасность сессий. Как быть с regenerate_id?

Безопасность сессий. Как быть с regenerate_id?

Собственно сабж заключается в следующем: как завещал phpnet использую временную метку для определения просроченных сессий

355
Jsf получение данных и DataTable

Jsf получение данных и DataTable

Как из JsF обращаться к колонкам DataTableПо каким id&?как происходит обращение внутрь к элементу

400