Именование интерфейсов/абстрактных классов в PHP 5.3 (использующий пространства имен)

Вы не должны использовать 4 пробелов на своей второй условной строке. Возможно, используйте:

if (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

кроме того, не забывайте, что пробел более гибок, чем Вы могли бы думать:

if (   
       cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something
if    (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

Оба из тех довольно ужасны все же.

, Возможно, теряют скобки (, Руководство по стилю препятствует этому хотя)?

if cond1 == 'val1' and cond2 == 'val2' and \
   cond3 == 'val3' and cond4 == 'val4':
    do_something

Это, по крайней мере, дает Вам некоторое дифференцирование.

Или даже:

if cond1 == 'val1' and cond2 == 'val2' and \
                       cond3 == 'val3' and \
                       cond4 == 'val4':
    do_something

я думаю, что предпочитаю:

if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something

Вот Руководство по стилю , который (с 2010) рекомендует использовать скобки.

29
задан hakre 18 April 2013 в 15:04
поделиться

5 ответов

По поводу этого вопроса (Аннотация и интерфейс) вы можете прочитать сообщение « Миграция библиотек и фреймворков ООП на PHP 5.3 » в блоге Мэтью Вейера О'Финни - это о Zend Framework и о том, как они могут решить эту проблему в версии 2.0.

Одна из вещей, которую они отмечают:

В других языках ООП, таких как Python, C #, интерфейсы обозначаются префикс интерфейса с заглавной буквы 'Я'; в приведенном выше примере мы бы тогда есть Zend :: View :: IView.

Итак, в вашем примере у вас будет что-то вроде этого, я думаю:

namespace Framework\Package\Subpackage;
abstract class ASubpackage {}
Framework/Package/Subpackage/ASubpackage.php

namespace Framework\Package\Subpackage;
interface ISubpackage {}
Framework/Package/Subpackage/ISubpackage.php

Что вы думаете об этом? (Я не тестировал этот способ, но это не похоже на плохую идею?)

9
ответ дан 28 November 2019 в 01:46
поделиться

SubpackageAbstract, SubpackageInterface

8
ответ дан 28 November 2019 в 01:46
поделиться

Я лично рекомендую избегать любого использования венгерской нотации и подумайте о следующих стандарт Java для имен интерфейсов; то есть они называются описательно, как и любой другой класс. См. этот вопрос SO для обсуждения тонкостей венгерской нотации.

Хороший пример использования общих описательных имен, указывающих на функциональность или поведение, можно найти в собственном SPL PHP, например: " Счетный »,« Итератор »,« ArrayObject ».

7
ответ дан 28 November 2019 в 01:46
поделиться

Честно говоря, я считаю, что венгерская нотация была введена с C #, потому что нет ключевых слов «extends» и «Implements», как в Java. Поэтому, чтобы различать, соглашение стало называть его IView. В Java интерфейс будет называться только View, а реализации будут называться DefaultViewImpl, SmartyViewImpl или что-то в этом роде. Поскольку PHP действительно расширяет и реализует ключевые слова, имеет смысл использовать соглашение Java. Я слышал аргумент, что венгерская нотация позволяет сделать элементы API идентифицируемыми, просто глядя на имена классов. В этом случае я бы назвал его IView или AbstractView.

1
ответ дан 28 November 2019 в 01:46
поделиться

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

namespace Framework\Package\Subpackage;
abstract class AbstractClass {}
Framework/Package/Subpackage/AbstractClass.php

namespace Framework\Package\Subpackage;
interface InterfaceClass {}
Framework/Package/Subpackage/InterfaceClass.php

обратите внимание, что это все еще не идеально (однако работает отлично), но я сохраняю код, похожий на исходную идею;)

-2
ответ дан 28 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: