Такое может быть. Взять хотя бы Активную запись, где для каждой таблицы свой класс. У всех этих классов может быть своя константа с именем таблицы в БД.
Я тоже так подумал. С другой стороны количество констант может быть достаточно велико (в данном случае 8) и добавлении большого количества таких методов будут замусоривать класс, а новых возможностей не добавит. Я думаю, что это дело вкуса.
Я не сторонник публичных свойств как статических так и нет. Но они есть и к ним можно таким образом обратиться, поэтому я и показал это. Не более.
Константы пишутся большими буквами, поэтому ошибиться будет сложно. Не обязательно не знать класс объекта, чтобы использовать пользоваться таким подходом.
Например из zf2.
public function __construct(InternalType\AbstractTypeObject $dictionary, \SplObjectStorage $processedDictionaries = null)
{
if ($dictionary->getType() != InternalType\AbstractTypeObject::TYPE_DICTIONARY) {
throw new Pdf\Exception('$dictionary mast be an indirect dictionary object.');
}
Можно заменить на.
public function __construct(InternalType\AbstractTypeObject $dictionary, \SplObjectStorage $processedDictionaries = null)
{
if ($dictionary->getType() != $dictionary::TYPE_DICTIONARY) {
throw new Pdf\Exception('$dictionary mast be an indirect dictionary object.');
}
На мой взгляд читаемость не снизилась, а может быть даже и повысились. Ведь сразу видно, что это константа класса именно этого объекта.
При переименовании класса, при таком подходе, потребуется внести меньше измененей.
> Если ктото сможет заинклюдить такой файлик вам в приложение, будете долго искать проблему.
Если кто-то смог что-то заинклюдить, то дальше уже нет смысла говорить о какой-то безопасности.
А вот то, что дебаггинг может усложниться — так это да.
Это уже дело архитектуры приложения. Если нужен именно глобальный доступ, то можно использовать Registry или Abstract factory. Или же опять использовать Depency injection.
Тоже делал подобный метод, но потом от него отказался, потому что: делаем общий метод для всех классов, но скрываем интерфейс конструктора; либо для каждого класса делаем метод, который дублирует интерфейс конструктора, но тогда при каждом изменении интерфейса нужно переписывать в нескольких местах (а такое случалось достаточно часто).
Поэтому отказался от такого подхода, чтобы пользователям моего класса не нужно было каждый раз лезть в исходный код соответствующего класса.
Постарайтесь начать следующую статью с краткого резюме, чтобы было понятно о чём вообще речь.
Зачем использовать эти сумасшедшие синглтоны, а затем искать пути обхода их и строить такие безумные конструкции?
public static function create(){
$args = \func_get_args();
$class = new \ReflectionClass(\get_called_class());
$constructor = $class->getConstructor();
if ($constructor->isPublic()){
$instance = $class->newInstanceArgs($args);
}else{
$constructor->setAccessible(true);
$instance = $class->newInstanceWithoutConstructor();
$constructor->invokeArgs($instance, $args);
}
return $instance;
}
Тем более, эта конструкция скрывает интерфейс конструктора и делает IDE в данном случае беспомощным, чтобы оказать нам помощь в виде подсказок. Кстати, тут используется ReflectionClass::newInstanceWithoutConstructor, который доступен с php5.4.
Лучше использовать DI, чем singleton: уменьшает связность кода; позвляет дать разработчикам только интерфейс класса, а не вынуждать их рыться в коде, чтобы понять как это работает; даёт возможность использования своих реализаций (можно подменять одни объекты на другие).
if (\is_file($fn)){
include $fn;
autoloadManager::getInstance()->cache($class, $fn);
unset($this->_map[$left]);
return true;
}else{
require $fn;
\clearstatcache(true);
throw new \Exception('File not found "'.$fn.'". Class: "'.$class.'".');
}
Можете пояснить пару моментов про приведённой статье?
> Подавляющее большинство из них знает, что включенный register_globals — это плохо, но при этом не могут привести реальный (а не вымученный) пример связанной с ним дыры в безопасности! А можете ли привести такой пример вы? (Подсказка: проблемы связаны с массивами и использованием []-синтаксиса в формах.)
О чём тут речь?
> А уж когда ты хозяин рынка, можно потихоньку подтягивать к себе высокопрофессиональную аудиторию: достаточно создать всего пару высоконагруженных проектов на PHP или даже частично на PHP (я намекаю на Facebook), и дело в шляпе.
Насколько были связаны разработчики Facebook и PHP, чтобы говорить, что Facebook был разработан для пиара PHP?
Константы пишутся большими буквами, поэтому ошибиться будет сложно. Не обязательно не знать класс объекта, чтобы использовать пользоваться таким подходом.
Например из zf2.
Можно заменить на.
На мой взгляд читаемость не снизилась, а может быть даже и повысились. Ведь сразу видно, что это константа класса именно этого объекта.
При переименовании класса, при таком подходе, потребуется внести меньше измененей.
Если кто-то смог что-то заинклюдить, то дальше уже нет смысла говорить о какой-то безопасности.
А вот то, что дебаггинг может усложниться — так это да.
Мне кажется, что сильновато называть появление namespace изменением парадигмы программирования.
>… фреймворки начали переписывать свой код на новый лад.
Из-за одного появления namespace — вряд ли…
>… но также открывает огромную дыру в безопасности приложения.
Поясните.
P.S. Про тесты и namespace уже упоминали на хабре.
Вот так бы выглядел Ваш код при таком подходе.
Поэтому отказался от такого подхода, чтобы пользователям моего класса не нужно было каждый раз лезть в исходный код соответствующего класса.
Зачем использовать эти сумасшедшие синглтоны, а затем искать пути обхода их и строить такие безумные конструкции?
Тем более, эта конструкция скрывает интерфейс конструктора и делает IDE в данном случае беспомощным, чтобы оказать нам помощь в виде подсказок. Кстати, тут используется ReflectionClass::newInstanceWithoutConstructor, который доступен с php5.4.
Лучше использовать DI, чем singleton: уменьшает связность кода; позвляет дать разработчикам только интерфейс класса, а не вынуждать их рыться в коде, чтобы понять как это работает; даёт возможность использования своих реализаций (можно подменять одни объекты на другие).
Странная вторая ветка.
> Подавляющее большинство из них знает, что включенный register_globals — это плохо, но при этом не могут привести реальный (а не вымученный) пример связанной с ним дыры в безопасности! А можете ли привести такой пример вы? (Подсказка: проблемы связаны с массивами и использованием []-синтаксиса в формах.)
О чём тут речь?
> А уж когда ты хозяин рынка, можно потихоньку подтягивать к себе высокопрофессиональную аудиторию: достаточно создать всего пару высоконагруженных проектов на PHP или даже частично на PHP (я намекаю на Facebook), и дело в шляпе.
Насколько были связаны разработчики Facebook и PHP, чтобы говорить, что Facebook был разработан для пиара PHP?
Если тесты я сделал правильно, ты выигрыш по времени больше чем в два раза.
Изощрённый ум сможет найти применение.