Создавать частные / защищенные переменные (свойства объекта) во время выполнения [duplicate]

Вы ищете

table(tabraw$V1)
# 
# CA CO OH 
#  1  1  2

Объект tab является объектом таблицы классов и не поддерживает функцию $.

Вы также можете получить желаемая информация от объекта tab с

rowSums(tab)
# CA CO OH 
#  1  1  2 
0
задан Felipe Francisco 22 January 2014 в 22:12
поделиться

1 ответ

Это не представляется возможным в текущих версиях PHP.

Хотя ReflectionProperty::setAccessible() делает , принимает логический аргумент, изменение, которое оно делает только позволяет самому Reflection получить доступ / не получить доступ к значению. Фактически это не изменяет доступность фактического свойства.

Как хакерское обходное решение для сохранения динамических свойств private, рассмотрите наличие свойств хранилища __set, которые на самом деле не существуют в выделенном частном массиве. Пример кода:

class Test {

    private $foo;
    public $bar;
    private $_properties;

    public function __get($prop) {
        if(property_exists($this, $prop))
            return $this->$prop;
        if(array_key_exists($prop, $this->_properties))
            return $this->_properties[$prop];
    }

    public function __set($prop, $value) {
        if(!property_exists($this, $prop)) {
            $this->_properties[$prop] = $value;
            echo 'SetDynamic: ', $prop, "\n";
            return;
        }
        $this->$prop = $value; 
        echo 'Set: ', $prop, "\n";
    }

}

Выполняется из интерактивной подсказки PHP:

php > $t = new Test;
php > $t->foo = 1;
Set: foo
php > $t->foo = 2;
Set: foo
php > $t->bar = 1;
php > $t->testorama = 1;
SetDynamic: testorama
php > $t->testorama = 2;
SetDynamic: testorama

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

3
ответ дан Charles 21 August 2018 в 10:52
поделиться
  • 1
    Хотя это не может быть лучшим решением, это работало именно так, как мне было нужно. Я не могу вызывать эти атрибуты непосредственно внутри класса, они используются только извне и не доступны из класса. Кроме того, теперь я вижу, что я неправильно понял концепцию метода setAccessible(). Благодаря! – Felipe Francisco 23 January 2014 в 03:49
Другие вопросы по тегам:

Похожие вопросы: