Я намерен создать классы, которые содержат чистые неизменяемые данные и простую черту (или класс, это не главное) для доступа к ним. Итак, фиктивный код для иллюстрации того, что я имею в виду:
//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()
метод?
Извините, если мой вопрос глуп, в этом случае я также был бы очень признателен конструктивным критикам.
Я не могу понять вашу аргументацию использования закрытия. В любом случае вы можете переписать его без закрытия.
class DataStorage {
use DataHandler;
static private $dataStorage = [
'key' => 'data'
];
}
trait DataHandler {
static public function get($property) {
return self::$dataStorage[$property];
}
}
echo DataStorage::get('key');
Постскриптум Лучше избегать статических значений, это приносит некоторые недостатки из глобальной переменной, такие как тесная связь.
Видимость ООП призвана помочь вам кодировать лучшую систему посредством инкапсуляции объектов. Это не пуленепробиваемый.
Труднее, хотя и не невозможно, злоупотреблять. Решительный человек
Можно написать мусорный код на любом языке.