Доступ к закрытым статическим свойствам через замыкания — это рационально?

Я намерен создать классы, которые содержат чистые неизменяемые данные и простую черту (или класс, это не главное) для доступа к ним. Итак, фиктивный код для иллюстрации того, что я имею в виду:

//Data class
class DataStorage
{
use DataHandler;

static private $dataStorage = [
'key' => 'data'
];
}

Черта для получения данных:

//Data getter
trait DataHandler
{
static public function get($property)
{
$func = function() use($property) {
return self::$dataStorage[$property];
};

$obtain = Closure::bind($func, NULL, get_class());

return $obtain();
}
}

Как вы видете, Closure используется для получения личных данных, это довольно просто и соответствует моим требованиям. Однако такой подход кажется несколько опасным. Похоже, что я мог получить доступ ЛЮБОЙ статическая частная собственность ЛЮБОЙ учебный класс.

Q1: Это идет вразрез с принципами ООП?

Q2: Это хорошее решение искусственно ограничить использование этой черты, сделав DataStorage класс как таковой, который реализует некоторый интерфейс и просто отметьте его в DataHandler::get() метод?

Извините, если мой вопрос глуп, в этом случае я также был бы очень признателен конструктивным критикам.

0

Решение

Я не могу понять вашу аргументацию использования закрытия. В любом случае вы можете переписать его без закрытия.

class DataStorage {
use DataHandler;
static private $dataStorage = [
'key' => 'data'
];
}

trait DataHandler {
static public function get($property) {
return self::$dataStorage[$property];
}
}

echo DataStorage::get('key');

http://3v4l.org/FOTob#v540

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

1

Другие решения

Видимость ООП призвана помочь вам кодировать лучшую систему посредством инкапсуляции объектов. Это не пуленепробиваемый.

Труднее, хотя и не невозможно, злоупотреблять. Решительный человек
Можно написать мусорный код на любом языке.

Аллен Голуб

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector