Опять же, вопрос проектирования, т.е. мы его тут до завтра можем обсуждать.
И всё же, будь в PHP множественное наследование, вопрос про интерфейсы бы так не стоял.
DB итак абстрактным является;
CacheStorage тем более интерфейс;
DBCacheStorage суть обвеска DB новыми функциями;
конструктор DB в качестве аргумента кушает тип DB, так что он с любой базой работает по умолчанию;
дополню вопрос: а если регистрировать автолоадер через spl, будет ли потеря скорости? у меня не наблюдается, профайлер показывает что это не является чем-то существенным.
Я в принципе согласен с вами, но где-то в глубине души я разделяю внешние стандарты, которые надо блюсти строго и внутренние, которые можно подогнать под своё удобство и в данной ситуации поддаюсь искушению наследоваться от Memcache, PDO, etc. потому, что это удобно.
Знаете-знаете, я думаю, просто название такое не слышали. =)
В любом языке вы пишите список аргументов и указываете их типы «void a(String a)», типа такого. Если какой-то из типов при вызове функции не совпал, то выпадает ошибка, либо компилятора, либо интерпретатора.
PHP же к типам так не придирается, ему число в строку преобразовать — раз плюнуть, поэтому в PHP убрали элементарные типы в качестве ограничений для параметров — если что, мол, типы к нужным сами приведём.
Поэтому такой код:
function a(string $x){}
в PHP неверен.
То что оставили нам это возможность указывать свои собственные типы в качестве желаемых, да ещё array, кажется и называется это всё дело «Type Hinting», т.е. возможность «подсказать тип».
Кстати, с помощью одного костыля можно реализовать и ограничения на простые типы, но я это у себя убрал вскоре, так как процентов на 5% скорость работы уменьшалась.
Да, если я правильно вас понял. Следить в данной ситуации это очень абстрактное понятие. Уточню для данной ситуации: один разработчик следит за собой и другими на этапе выполнения скрипта. Раньше увидеть ошибку в данной ситуации проблемотично.
Вы же знаете, наверное, что такое Type Hinting?
Повторю свой пример с кешем. Есть управляющая функция, которая принимает объекты, реализующие интерфейс Cacheable. Такими являются MemCacheStorage, ApcCacheStorage, FileCacheStorage, DbCacheStorage.
Какой из них будет применён решает юзер в конфиге, функции в принципе пофиг, но ровно до момента когда нужный класс не инициализировался или кто-то попробовал подать на вход чужеродный класс. Тут-то и выпадет ошибка.
Ну так. Допустим мы реализуем кеш через Memcache. Класс-аксессор при этом принимает в конструкторе параметр типа CacheSorage.
Тогда мы создаём свой класс так:
class MemCacheStorage extends Memcache implemens CacheStorage.
Вы правы — интерфейсы не дают ничего нового, всё что они могут — ограничить нас в количестве ошибок, не более того.
Хорошо, допустим такой пример. Абстрагируем кеш. В данной ситуации от вашего абстрактного класса ни останется ни единого конкретного метода, одни абстрактные. В принципе это всё равно можно сделать абстрактным классом, но тогда теряется возможность наследовать в классе-реализаторе ещё какой-то класс.
Из трёх предложенных вами случаев новое окно оправдано только в первом.
В последнем случае пользователь должен сам решать, как и где открывать. Очень распространённая ошибка — ставить ссылку в новое окно потому, что она ведёт на другой сайт. Типа если что, то эт не мы карябали, к нам нет претензий. Это совершенно неверный подход.
Во втором случае оправданием может являться только траффик. Если вы уважаете своих пользователей вы должны о нём предупредить, но не более того.
Кстати вот, живой пример, посмотрите, сейчас в новых висит статья про Wordpress 2.5. Её уже минусуют, и если автор не уберёт её в ближайшее время, то ему придётся несколько раз оправдываться в том, что он не видел 2–3 абсолютно таких же статьи неделю назад.
Вот вам стандартный набор поводов для минуса:
— вы написали интересно, но не раскрыли тему;
— вы тупо скопировали что-то и вас поймали на этом;
— вы попытались пошутить, но получилось не смешно;
— вы создали неинтересный опрос;
— вы создали интересный опрос, но забыли написать вариант с упоминанием НЛО;
— вы упомянули Лебедева;
— вы критикуете какую-то ОС или даёте повод к любому холивару;
— вы пиарите себя, пытаясь это замаскировать.
Вот вам на вскидку, плюс думаю ещё кучу можно придумать.
И всё же, будь в PHP множественное наследование, вопрос про интерфейсы бы так не стоял.
CacheStorage тем более интерфейс;
DBCacheStorage суть обвеска DB новыми функциями;
конструктор DB в качестве аргумента кушает тип DB, так что он с любой базой работает по умолчанию;
Если не секрет, почему вас так тянет на абстрактные классы? =)
В любом языке вы пишите список аргументов и указываете их типы «void a(String a)», типа такого. Если какой-то из типов при вызове функции не совпал, то выпадает ошибка, либо компилятора, либо интерпретатора.
PHP же к типам так не придирается, ему число в строку преобразовать — раз плюнуть, поэтому в PHP убрали элементарные типы в качестве ограничений для параметров — если что, мол, типы к нужным сами приведём.
Поэтому такой код:
в PHP неверен.
То что оставили нам это возможность указывать свои собственные типы в качестве желаемых, да ещё array, кажется и называется это всё дело «Type Hinting», т.е. возможность «подсказать тип».
Кстати, с помощью одного костыля можно реализовать и ограничения на простые типы, но я это у себя убрал вскоре, так как процентов на 5% скорость работы уменьшалась.
Вы же знаете, наверное, что такое Type Hinting?
Какой из них будет применён решает юзер в конфиге, функции в принципе пофиг, но ровно до момента когда нужный класс не инициализировался или кто-то попробовал подать на вход чужеродный класс. Тут-то и выпадет ошибка.
Тогда мы создаём свой класс так:
class MemCacheStorage extends Memcache implemens CacheStorage.
Вы правы — интерфейсы не дают ничего нового, всё что они могут — ограничить нас в количестве ошибок, не более того.
В последнем случае пользователь должен сам решать, как и где открывать. Очень распространённая ошибка — ставить ссылку в новое окно потому, что она ведёт на другой сайт. Типа если что, то эт не мы карябали, к нам нет претензий. Это совершенно неверный подход.
Во втором случае оправданием может являться только траффик. Если вы уважаете своих пользователей вы должны о нём предупредить, но не более того.
— вы написали интересно, но не раскрыли тему;
— вы тупо скопировали что-то и вас поймали на этом;
— вы попытались пошутить, но получилось не смешно;
— вы создали неинтересный опрос;
— вы создали интересный опрос, но забыли написать вариант с упоминанием НЛО;
— вы упомянули Лебедева;
— вы критикуете какую-то ОС или даёте повод к любому холивару;
— вы пиарите себя, пытаясь это замаскировать.
Вот вам на вскидку, плюс думаю ещё кучу можно придумать.