Обновить
44
0
sectus@sectus

Пользователь

Отправить сообщение
Кстати, чуть не забыл, статические методы можно вызывать и через "->".: )
Такое может быть. Взять хотя бы Активную запись, где для каждой таблицы свой класс. У всех этих классов может быть своя константа с именем таблицы в БД.
Я тоже так подумал. С другой стороны количество констант может быть достаточно велико (в данном случае 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.');
        }


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

При переименовании класса, при таком подходе, потребуется внести меньше измененей.
> Если ктото сможет заинклюдить такой файлик вам в приложение, будете долго искать проблему.
Если кто-то смог что-то заинклюдить, то дальше уже нет смысла говорить о какой-то безопасности.

А вот то, что дебаггинг может усложниться — так это да.
>… изменение парадигмы программирования на PHP.
Мне кажется, что сильновато называть появление namespace изменением парадигмы программирования.

>… фреймворки начали переписывать свой код на новый лад.
Из-за одного появления namespace — вряд ли…

>… но также открывает огромную дыру в безопасности приложения.
Поясните.

P.S. Про тесты и namespace уже упоминали на хабре.
Расскажите о том, как PDO заботится о безопасности?
Это уже дело архитектуры приложения. Если нужен именно глобальный доступ, то можно использовать Registry или Abstract factory. Или же опять использовать Depency injection.
DI — это просто подход, ничего загружать не надо.

Вот так бы выглядел Ваш код при таком подходе.
$autoloadManager = new autoloadManager();
$autoloadManager->registerClassLoader(new classMapLoader(array(
            'className' => 'path/to/fileName.php',
            'className2' => 'path2/to/fileName2.php',
                ), __DIR__ . '/path/to/src', 'namespace'));
Тоже делал подобный метод, но потом от него отказался, потому что: делаем общий метод для всех классов, но скрываем интерфейс конструктора; либо для каждого класса делаем метод, который дублирует интерфейс конструктора, но тогда при каждом изменении интерфейса нужно переписывать в нескольких местах (а такое случалось достаточно часто).

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

Зачем использовать эти сумасшедшие синглтоны, а затем искать пути обхода их и строить такие безумные конструкции?
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.'".');
			}

Странная вторая ветка.
А всё думал как же будут продвигать корпоративные блоги…
Так assert почти тоже самое что и eval.

namespace assert;

error_reporting(-1);

function assert($assertion)
    {
    if (!$return = (boolean)eval('return ' . $assertion . ';'))
        trigger_error('Assertion "' . $assertion . '" failed', E_USER_WARNING);
    return $return;
    }

$test = 'TEST; some;';
\assert($test);
assert($test);

$test = '1';
\assert($test);
assert($test);

$test = '0';
\assert($test);
assert($test);

$test = 'print "print" . PHP_EOL';
\assert($test);
assert($test);

$test = 'exec("ls")';
\assert($test);
assert($test);

$test = 'exec("dir")';
\assert($test);
assert($test);
Не могу понять к чему Вы клоните… Вы используете eval у себя в проектах? Почему да или нет?
Тут. Не здесь.
Можете пояснить пару моментов про приведённой статье?

> Подавляющее большинство из них знает, что включенный register_globals — это плохо, но при этом не могут привести реальный (а не вымученный) пример связанной с ним дыры в безопасности! А можете ли привести такой пример вы? (Подсказка: проблемы связаны с массивами и использованием []-синтаксиса в формах.)

О чём тут речь?

> А уж когда ты хозяин рынка, можно потихоньку подтягивать к себе высокопрофессиональную аудиторию: достаточно создать всего пару высоконагруженных проектов на PHP или даже частично на PHP (я намекаю на Facebook), и дело в шляпе.

Насколько были связаны разработчики Facebook и PHP, чтобы говорить, что Facebook был разработан для пиара PHP?
Взял в кавычки %)
http://pastebin.com/dnVjbcu1

Если тесты я сделал правильно, ты выигрыш по времени больше чем в два раза.
Да хотя бы и SOAP. Написав несложный класс можно будет практически любой объект конвертировать в XML.

Изощрённый ум сможет найти применение.
Конечно. Но случаи бывают разные.

Информация

В рейтинге
Не участвует
Откуда
Иркутск, Иркутская обл., Россия
Зарегистрирован
Активность