File: coding_standard.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (1204 lines) | stat: -rw-r--r-- 48,786 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<appendix id="coding-standard">
    <title>Padrão de Codificação do Zend Framework para PHP</title>

    <sect1 id="coding-standard.overview">
        <title>Visão geral</title>

        <sect2 id="coding-standard.overview.scope">
            <title>Escopo</title>

            <para>
                Este documento fornece instruções para formatação e documentação de código a
                indivíduos e times que contribuem com o Zend Framework. Muitos desenvolvedores que
                utilizam o Zend Framework acham que estes padrões são igualmente importantes para
                que seu estilo de codificação permaneça consistente com todo o código do Framework.
                Vale também notar que é necessário esforço significativo para especificar padrões de
                codificação por completo.
            </para>

            <note>
                <para>
                    Por vezes, desenvolvedores consideram o estabelecimento de um padrão mais
                    importante do que o padrão sugere de verdade ao nível mais detalhado de design.
                    As instruções nos padrões de codificação do Zend Framework absorvem práticas que
                    funcionaram bem no projeto do Framework. Você pode alterar tais padrões ou
                    usá-los "as is" de acordo com os termos de nossa <ulink
                        url="http://framework.zend.com/license">licença</ulink>.
                </para>
            </note>

            <para>
                Os tópicos abordados nos padrões de codificação do Zend Framework incluem:
            </para>

            <itemizedlist>
                <listitem>
                    <para>Formatação de arquivos <acronym>PHP</acronym></para>
                </listitem>

                <listitem>
                    <para>Convenções de nomenclatura</para>
                </listitem>

                <listitem>
                    <para>Estilo de codificação</para>
                </listitem>

                <listitem>
                    <para>Documentação em linha de código</para>
                </listitem>
            </itemizedlist>
        </sect2>

        <sect2 id="coding-standard.overview.goals">
            <title>Objetivos</title>

            <para>
                Padrões de codificação são importantes em qualquer projeto de desenvolvimento, mas
                são particularmente importantes quando muitos desenvolvedores estão trabalhando no
                mesmo projeto. Eles ajudam a garantir que o código possua alta qualidade, poucos
                bugs e possam ser facilmente mantidos.
            </para>
        </sect2>
    </sect1>

    <sect1 id="coding-standard.php-file-formatting">
        <title>Formatação de Arquivos PHP</title>

        <sect2 id="coding-standard.php-file-formatting.general">
            <title>Geral</title>

            <para>
                Para arquivos que contenham somente código <acronym>PHP</acronym>, a tag de
                fechamento ("?>") nunca é permitida. Ela não é exigida pelo <acronym>PHP</acronym> e
                omiti-la previne a injeção acidental de espaços em branco desnecessários na
                resposta.
            </para>

            <note>
                <para>
                    <emphasis>Importante</emphasis>: A inclusão de dados binários arbitrários, como
                    permitido pela função <methodname>__HALT_COMPILER()</methodname>, é proibida a
                    partir de arquivos <acronym>PHP</acronym> no projeto Zend Framework ou de
                    arquivos derivados deles. O uso deste recurso é permitido somente para alguns
                    scripts de instalação.
                </para>
            </note>
        </sect2>

        <sect2 id="coding-standard.php-file-formatting.indentation">
            <title>Indentação</title>

            <para>A indentação deve consistir de 4 espaços. Tabulações não são permitidas.</para>
        </sect2>

        <sect2 id="coding-standard.php-file-formatting.max-line-length">
            <title>Comprimento máximo de linha</title>

            <para>
                O comprimento desejável das linhas é 80 caracteres. Isto significa que
                desenvolvedores do Zend Framework devem se esforçar para manter cada linha de seus
                códigos com menos que 80 caracteres onde possível e prático. Entretanto, linhas
                maiores são aceitáveis em algumas circunstâncias. O comprimento máximo de qualquer
                linha de código <acronym>PHP</acronym> é 120 caracteres.
            </para>
        </sect2>

        <sect2 id="coding-standard.php-file-formatting.line-termination">
            <title>Quebra de linha</title>

            <para>
                Quebras de linha seguem a convenção de arquivos de texto Unix. As linhas devem
                terminar com um único caractere de quebra -- linefeed (LF). Caracteres de quebra são
                representados como ordinal 10 ou hexadecimal 0x0A.
            </para>

            <para>
                Nota: Não use retornos -- carriage returns (CR) -- como é a convenção em arquivos
                dos sistemas Apple (0x0D) ou a combinação de retorno e quebra
                (<acronym>CRLF</acronym>), como é o padrão dos sistemas Windows (0x0D, 0x0A).
            </para>
        </sect2>
    </sect1>

    <sect1 id="coding-standard.naming-conventions">
        <title>Convenções de Nomenclatura</title>

        <sect2 id="coding-standard.naming-conventions.classes">
            <title>Classes</title>

            <para>
                O Zend Framework utiliza um padrão de nomes de classes de forma que os nomes das
                classes mapeiam diretamente os diretórios onde estão armazenadas. O diretório raiz
                da biblioteca padrão do Zend Framework é o diretório "Zend/" e o diretório raiz da
                biblioteca de extras é "ZendX/". Todas as classes do Zend Framework são armazenadas
                hierarquicamente sob tais diretórios.
            </para>

            <para>
                Nomes de classes devem conter somente caracteres alfanuméricos. Números são
                permitidos em nomes de classes mas são desencorajados na maioria dos casos.
                Underscores são permitidos somente no lugar de separador de diretórios. O arquivo
                "<filename>Zend/Db/Table.php</filename>", por exemplo, deve mapear a classe de nome
                "<classname>Zend_Db_Table</classname>".
            </para>

            <para>
                Se um nome de classe é composto de mais de uma palavra, a primeira letra de cada
                nova palavra deve ser maiúscula. Letras maiúsculas em sequência não são permitidas.
                A classe "Zend_PDF", por exemplo, não é permitida, enquanto
                "<classname>Zend_Pdf</classname>" é.
            </para>

            <para>
                Estas convenções definem um mecanismo de pseudonamespace para o Framework. O Zend
                Framework irá adotar o recurso de namespace do <acronym>PHP</acronym> assim que ele
                se tornar disponível e prático para nossos desenvolvedores os utilizarem em suas
                aplicações.
            </para>

            <para>
                Exemplos desta convenção de nomenclatura podem ser vistos em nomes de classes nas
                bibliotecas padrão e de extras.
            </para>

            <note>
                <para>
                    <emphasis>Importante</emphasis>: Códigos que devem ser disponibilizados junto às
                    bibliotecas do Zend Framework mas não são parte das bibliotecas padrão ou de
                    extras (por exemplo, código de aplicação ou bibliotecas que não são distribuídas
                    pela Zend) nunca devem iniciar com "Zend_" ou "ZendX_".
                </para>
            </note>
        </sect2>

        <sect2 id="coding-standard.naming-conventions.abstracts">
            <title>Classes abstratas</title>

            <para>
                Em geral, classes abstratas seguem as mesmas convenções de <link
                    linkend="coding-standard.naming-conventions.classes">classes</link>, com uma
                regra adicional: nomes de classes abstratas devem terminar com o termo "Abstract",
                que não pode ser precedido por um underscore. Por exemplo,
                <classname>Zend_Controller_Plugin_Abstract</classname> é considerado um nome
                inválido, mas <classname>Zend_Controller_PluginAbstract</classname> ou
                <classname>Zend_Controller_Plugin_PluginAbstract</classname> seriam nomes válidos.
            </para>

            <note>
                <para>
                    Esta convenção de codificação é nova na versão 1.9.0 do Zend Framework. Classes
                    de datas anteriores a esta versão podem não seguir esta regra mas serão
                    renomeadas no futuro a fim de obedecê-la.
                </para>

                <para>
                    A razão de tal mudança é o uso de namespace. Como pretendemos que o Zend
                    Framework 2.0 utilize <acronym>PHP</acronym> 5.3, utilizaremos namespaces. A
                    maneira mais fácil de automatizar a conversão para namespaces é simplemente
                    converter underscores para o separador de namespace -- mas sob as antigas
                    convenções de nomenclatura isto deixa o nome da classe como somente "Abstract"
                    ou "Interface" -- as quais são palavras-chave reservadas em
                    <acronym>PHP</acronym>. Se prefixarmos o nome do (sub)componente ao nome da
                    classe, podemos evitar tais problemas.
                </para>

                <para>
                    Para ilustrar a situação, considere converter a classe
                    <classname>Zend_Controller_Request_Abstract</classname> para utilizar
                    namespaces:
                </para>

                <programlisting language="php"><![CDATA[
namespace Zend\Controller\Request;

abstract class Abstract
{
    // ...
}
]]></programlisting>

                <para>
                    Claramente isto não irá funcionar. Sob as novas convenções de nomenclatura,
                    entretanto, isso se tornaria:
                </para>

                <programlisting language="php"><![CDATA[
namespace Zend\Controller\Request;

abstract class RequestAbstract
{
    // ...
}
]]></programlisting>

                <para>
                    Ainda retemos a semântica e a separação de namespace enquanto omitimos os
                    problemas com palavras-chave; ao mesmo tempo, a classe abstrata é melhor
                    descrita.
                </para>
            </note>
        </sect2>

        <sect2 id="coding-standard.naming-conventions.interfaces">
            <title>Interfaces</title>

            <para>
                Em geral, interfaces seguem as mesmas convenções de <link
                    linkend="coding-standard.naming-conventions.classes">classes</link>, com uma
                regra adicional: nomes de interface podem opcionalmente terminar com o termo
                "Interface", que não pode ser precedido por um underscore. Por exemplo,
                <classname>Zend_Controller_Plugin_Interface</classname> é considerado um nome
                inválido, mas <classname>Zend_Controller_PluginInterface</classname> ou
                <classname>Zend_Controller_Plugin_PluginInterface</classname> seriam nomes válidos.
            </para>

            <para>
                Embora esta regra não seja obrigatória, ela é fortemente recomendada, já que provê
                uma boa pista visual aos desenvolvedores sobre quais arquivos contém interfaces em
                vez de classes.
            </para>

            <note>
                <para>
                    Esta convenção de nomenclatura é nova na versão 1.9.0 do Zend Framework. Classes
                    de datas anteriores a esta versão podem não seguir esta regra, mas serão
                    renomeadas no futuro a fim de obedecê-la. Veja <link
                        linkend="coding-standard.naming-conventions.abstracts">a seção
                        anterior</link> para informações sobre a razão da mudança.
                </para>
            </note>
        </sect2>

        <sect2 id="coding-standard.naming-conventions.filenames">
            <title>Nomes de arquivos</title>

            <para>
                Para todos os outros arquivos, somente caracteres alfanuméricos, underscores e
                hifens são permitidos. Espaços são estritamente proibidos.
            </para>

            <para>
                Qualquer arquivo que contenha código <acronym>PHP</acronym> deve terminar com a
                extensão "<filename>.php</filename>", com a notável exceção de scripts de view. Os
                exemplos a seguir mostram nomes de arquivo aceitáveis para classes do Zend
                Framework:
            </para>

            <programlisting language="php"><![CDATA[
Zend/Db.php

Zend/Controller/Front.php

Zend/View/Helper/FormRadio.php
]]></programlisting>

            <para>
                Nomes de arquivos devem mapear nomes de classes, como descrito acima.
            </para>
        </sect2>

        <sect2 id="coding-standard.naming-conventions.functions-and-methods">
            <title>Funções e métodos</title>

            <para>
                Nomes de funções devem conter somente caracteres alfanuméricos, não sendo
                underscores permitidos. Números são permitidos mas desencorajados na maioria dos
                casos.
            </para>

            <para>
                Nomes de funções devem sempre começar com letra minúscula e, quando consistir de
                mais de uma palavra, a primeira letra de cada palavra deve ser maiúscula. Esta
                formatação é comumente chamada de "camelCase".
            </para>

            <para>
                A utilização de verbos é geralmente encorajada, devendo os nomes de funções ser tão
                verbais quanto prático a fim de descrever de forma clara seu propósito e
                comportamento.
            </para>

            <para>
                Estes são exemplos de nomes aceitáveis de funções:
            </para>

            <programlisting language="php"><![CDATA[
filterInput()

getElementById()

widgetFactory()
]]></programlisting>

            <para>
                Para programação orientada a objetos, acessores de variáveis estáticas ou de
                instância devem sempre ser prefixados com "get" ou "set". Ao implementar padrões de
                design (“design patterns”), como o singleton ou o factory, o nome do método deve
                conter o nome do padrão onde prático a fim de descrever claramente seu
                comportamento.
            </para>

            <para>
                Para métodos de objetos que são declarados com o modificador "private" ou
                "protected", o primeiro caractere do nome do método deve ser um underscore. Esta é a
                única aplicação aceitável de um underscore em um nome de método. Métodos declarados
                como "public" nunca devem conter um underscore.
            </para>

            <para>
                Funções em escopo global (também chamadas de "funções flutuantes") são permitidas
                mas desencorajadas na maioria dos casos. Considere encapsular estas funções em uma
                classe estática.
            </para>
        </sect2>

        <sect2 id="coding-standard.naming-conventions.variables">
            <title>Variáveis</title>

            <para>
                Nomes de variáveis devem conter somente caracteres alfanuméricos, não sendo
                underscores permitidos. Números são permitidos mas são desencorajados na maioria dos
                casos.
            </para>

            <para>
                Para variáveis de instância declaradas com o modificador "private" ou "protected", o
                primeiro caractere do nome da variável deve ser um underscore. Esta é a única
                aplicação aceitável de um underscore em nome de variável. Variáveis-membras
                declaradas com "public" nunca devem começar com um underscore.
            </para>

            <para>
                Assim como nomes de funções (veja seção 3.3), nomes de variáveis devem sempre
                começar com uma letra minúscula e seguir a convenção "camelCase".
            </para>

            <para>
                A utilização de verbos é encorajada, ou seja, variáveis devem sempre ser tão verbais
                quanto prático para descrever os dados que o desenvolvedor pretende armazenar nelas.
                Nomes concisos de variáveis como "<varname>$i</varname>" e "<varname>$n</varname>"
                são desencorajados para todos os contextos de laço, exceto os menores. Se um loop
                contém mais de 20 linhas de código então as variáveis de índice devem ter nomes mais
                descritivos.
            </para>
        </sect2>

        <sect2 id="coding-standard.naming-conventions.constants">
            <title>Constantes</title>

            <para>
                Constantes devem conter tanto caracteres alfanuméricos quanto underscores. Números
                são permitidos.
            </para>

            <para>
                Todas as letras usadas em um nome de constante devem ser maiúsculas, enquanto todas
                as palavras devem ser separadas por underscores.
            </para>

            <para>
                Por exemplo, <constant>EMBED_SUPPRESS_EMBED_EXCEPTION</constant> é permitido
                enquanto <constant>EMBED_SUPPRESSEMBEDEXCEPTION</constant> não.
            </para>

            <para>
                Constantes devem ser definidas como membras de classe com o modificador "const".
                Definir constantes em escopo global com a função "define" é permitido mas fortemente
                desencorajado.
            </para>
        </sect2>
    </sect1>

    <sect1 id="coding-standard.coding-style">
        <title>Estilo de Codificação</title>

        <sect2 id="coding-standard.coding-style.php-code-demarcation">
            <title>Demarcação de código PHP</title>

            <para>
                Código <acronym>PHP</acronym> deve sempre ser delimitado pelas tags na forma
                completa, padrão do <acronym>PHP</acronym>:
            </para>

            <programlisting language="php"><![CDATA[
<?php

?>
]]></programlisting>

            <para>
                Tags reduzidas nunca não permitidas. Para arquivos que contenham somente código
                <acronym>PHP</acronym>, a tag de fechamento deve sempre ser omitida (veja <link
                    linkend="coding-standard.php-file-formatting.general">a seção Geral</link>).
            </para>
        </sect2>

        <sect2 id="coding-standard.coding-style.strings">
            <title>Strings</title>

            <sect3 id="coding-standard.coding-style.strings.literals">
                <title>Strings literais</title>

                <para>
                    Quando uma string é literal (não contém substituição de variáveis), o apóstrofo
                    ou "aspa simples" deve sempre ser utilizado para demarcar a string:
                </para>

                <programlisting language="php"><![CDATA[
$a = 'Example String';
]]></programlisting>
            </sect3>

            <sect3 id="coding-standard.coding-style.strings.literals-containing-apostrophes">
                <title>Strings literais contendo apóstrofos</title>

                <para>
                    Quando uma string literal em si contém apóstrofos, é permitido demarcar a string
                    com aspas ou "aspas duplas". Isto é especialmente útil para sentenças
                    <constant>SQL</constant>:
                </para>

                <programlisting language="php"><![CDATA[
$sql = "SELECT `id`, `name` from `people` "
     . "WHERE `name`='Fred' OR `name`='Susan'";
]]></programlisting>

                <para>
                    Esta sintaxe é preferível a escapar os apóstrofos uma vez que é muito mais
                    legível.
                </para>
            </sect3>

            <sect3 id="coding-standard.coding-style.strings.variable-substitution">
                <title>Substituição de variáveis</title>

                <para>
                    A substituição de variáveis é permitida utilizando qualquer uma destas formas:
                </para>

                <programlisting language="php"><![CDATA[
$greeting = "Hello $name, welcome back!";

$greeting = "Hello {$name}, welcome back!";
]]></programlisting>

                <para>
                    Por consistência, esta forma não é permitida:
                </para>

                <programlisting language="php"><![CDATA[
$greeting = "Hello ${name}, welcome back!";
]]></programlisting>
            </sect3>

            <sect3 id="coding-standard.coding-style.strings.string-concatenation">
                <title>Concatenação de strings</title>

                <para>
                    Strings devem ser concatenadas utilizando o operador ".". Um espaço deve sempre
                    ser adicionado antes e depois do operador "." para melhorar a legibilidade:
                </para>

                <programlisting language="php"><![CDATA[
$company = 'Zend' . ' ' . 'Technologies';
]]></programlisting>

                <para>
                    Ao concatenar strings com o operador "." encoraja-se quebrar a expressão em
                    múltiplas linhas para facilitar a leitura. Nestes casos, cada linha sucessiva
                    deve ser indentada com espaços em branco de forma que o operador "." fique
                    alinhado com o operador "=":
                </para>

                <programlisting language="php"><![CDATA[
$sql = "SELECT `id`, `name` FROM `people` "
     . "WHERE `name` = 'Susan' "
     . "ORDER BY `name` ASC ";
]]></programlisting>
            </sect3>
        </sect2>

        <sect2 id="coding-standard.coding-style.arrays">
            <title>Arrays</title>

            <sect3 id="coding-standard.coding-style.arrays.numerically-indexed">
                <title>Arrays numericamente indexados</title>

                <para>Números negativos não são permitidos como índices.</para>

                <para>
                    Um array indexado deve iniciar com um número não-negativo. Entretanto, índices
                    iniciados em números diferentes de 0 são desencorajados.
                </para>

                <para>
                    Ao declarar arrays indexados com a função <type>Array</type>, um espaço deve ser
                    adicionado após cada vírgula delimitadora para aumentar a legibilidade:
                </para>

                <programlisting language="php"><![CDATA[
$sampleArray = array(1, 2, 3, 'Zend', 'Studio');
]]></programlisting>

                <para>
                    É permitido declarar arrays indexados em várias linhas utilizando o construtor
                    "array". Neste caso, cada linha sucessiva deve ser indentada com espaços de
                    forma que o começo de cada linha fique alinhado:
                </para>

                <programlisting language="php"><![CDATA[
$sampleArray = array(1, 2, 3, 'Zend', 'Studio',
                     $a, $b, $c,
                     56.44, $d, 500);
]]></programlisting>

                <para>
                    Alternativamente, o item inicial do array pode começar na linha seguinte. Neste
                    caso, ele deve ser indentado em um nível a mais que a linha que contém a
                    declaração do array e todas as linhas sucessivas devem ter a mesma indentação. O
                    parêntese de fechamento deve estar em uma linha a parte no mesmo nível de
                    indentação da linha que contém a declaração do array:
                </para>

                <programlisting language="php"><![CDATA[
$sampleArray = array(
    1, 2, 3, 'Zend', 'Studio',
    $a, $b, $c,
    56.44, $d, 500,
);
]]></programlisting>

                <para>
                    Ao usar esta última declaração, encorajamos utilizar uma vírgula após o último
                    item do array. Isto minimiza o impacto de adicionar novos itens em linhas
                    sucessivas e ajuda a garantir que nenhum erro ocorra devido à ausência de uma
                    vírgula.
                </para>
            </sect3>

            <sect3 id="coding-standard.coding-style.arrays.associative">
                <title>Arrays associativos</title>

                <para>
                    Ao declarar arrays associativos com o construtor <type>Array</type>, encoraja-se
                    quebrar a expressão em várias linhas. Neste caso, cada linha sucessiva deve ser
                    indentada com espaços em branco de forma que as chaves e os valores fiquem
                    alinhados:
                </para>

                <programlisting language="php"><![CDATA[
$sampleArray = array('firstKey'  => 'firstValue',
                     'secondKey' => 'secondValue');
]]></programlisting>

                <para>
                    Alternativamente, o item inicial do array pode começar na linha seguinte. Neste
                    caso, ele deve ser indentado a um nível a mais que a linha contendo a declaração
                    do array e todas as linhas sucessivas devem ter a mesma indentação. O parêntese
                    de fechamento deve estar em uma linha própria, no mesmo nível de indentação da
                    linha que contém a declaração do array. Para legibilidade, os vários operadores
                    de atribuição "=>" devem ser espaçados de forma a ficarem alinhados.
                </para>

                <programlisting language="php"><![CDATA[
$sampleArray = array(
    'firstKey'  => 'firstValue',
    'secondKey' => 'secondValue',
);
]]></programlisting>

                <para>
                    Ao utilizar esta última declaração, encorajamos utilizar uma vírgula após o
                    último item do array; isto minimiza o impacto de adicionar novos itens em linhas
                    sucessivas e ajuda a garantir que nenhum erro ocorra devido à ausência de uma
                    vírgula.
                </para>
            </sect3>
        </sect2>

        <sect2 id="coding-standard.coding-style.classes">
            <title>Classes</title>

            <sect3 id="coding-standard.coding-style.classes.declaration">
                <title>Declaração de classe</title>

                <para>
                    Classes devem ser nomeadas de acordo com a convenção de nomenclatura do Zend
                    Framework.
                </para>

                <para>
                    A chave deve ser sempre escrita na linha abaixo do nome da classe.
                </para>

                <para>
                    Toda classe deve ter um bloco de documentação em conformidade ao padrão do
                    PHPDocumentor.
                </para>

                <para>
                    Todo código em uma classe deve ser indentado com quatro espaços.
                </para>

                <para>
                    Apenas uma única classe é permitida em cada arquivo <acronym>PHP</acronym>.
                </para>

                <para>
                    A inserção de código adicional em arquivos de classe é permitida, mas
                    desencorajada. Em tais arquivos, duas linhas em branco devem separar a classe de
                    qualquer código <acronym>PHP</acronym> no arquivo.
                </para>

                <para>
                    A seguir, um exemplo de declaração de classe aceitável:
                </para>

                <programlisting language="php"><![CDATA[
/**
 * Bloco de documentação aqui.
 */
class SampleClass
{
    // todo conteúdo de classe
    // deve ser indentado quatro espaços
}
]]></programlisting>

                <para>
                    Classes que estendem outras classes ou que implementam interfaces devem declarar
                    suas dependências na mesma linha, quando possível.
                </para>

                <programlisting language="php"><![CDATA[
class SampleClass extends FooAbstract implements BarInterface
{
}
]]></programlisting>

                <para>
                    Se estas operações fizerem com que o comprimento da linha exceda o <link
                        linkend="coding-standard.php-file-formatting.max-line-length">comprimento
                        máximo</link>, quebre a linha antes das palavras-chave "extends" e/ou
                    "implements", e indente tais linhas em mais um nível.
                </para>

                <programlisting language="php"><![CDATA[
class SampleClass
    extends FooAbstract
    implements BarInterface
{
}
]]></programlisting>

                <para>
                    Se a classe implementa múltiplas interfaces e a declaração excede o comprimento
                    máximo da linha, quebre após cada interface separada por vírgula e indente os
                    nomes das interfaces de forma a ficarem alinhados.
                </para>

                <programlisting language="php"><![CDATA[
class SampleClass
    implements BarInterface,
               BazInterface
{
}
]]></programlisting>
            </sect3>

            <sect3 id="coding-standard.coding-style.classes.member-variables">
                <title>Variáveis membras de classes</title>

                <para>
                    Variáveis-membras devem ser nomeadas de acordo com as convenções de nomenclatura
                    de variáveis do Zend Framework.
                </para>

                <para>
                    Quaisquer variáveis declaradas em uma classe devem ser listadas no topo da
                    classe, acima da declaração de quaisquer métodos.
                </para>

                <para>
                    O construtor <emphasis>var</emphasis> não é permitido. Variáveis-membras devem
                    sempre declarar sua visibilidade usando um dos modificadores
                    <property>private</property>, <property>protected</property> ou
                    <property>public</property>. Dar acesso direto a variáveis-membras declarando-as
                    como públicas é permitido mas desencorajado. Em vez disso, utilize métodos
                    acessores (set e get).
                </para>
            </sect3>
        </sect2>

        <sect2 id="coding-standard.coding-style.functions-and-methods">
            <title>Funções e métodos</title>

            <sect3 id="coding-standard.coding-style.functions-and-methods.declaration">
                <title>Declaração de funções e métodos</title>

                <para>
                    Funções devem ser nomeadas de acordo com as convenções de nomenclatura do Zend
                    Framework.
                </para>

                <para>
                    Métodos dentro de classes devem sempre declarar sua visibilidade usando um dos
                    modificadores <property>private</property>, <property>protected</property> ou
                    <property>public</property>.
                </para>

                <para>
                    Assim como ocorre com classes, a chave deve sempre ser escrita na linha abaixo
                    do nome da função. Espaços entre o nome da função e o parêntese de abertura para
                    os argumentos não são permitidos.
                </para>

                <para>
                    Funções em escopo global são fortemente desencorajadas.
                </para>

                <para>
                    A seguir, um exemplo de declaração aceitável de função em uma classe:
                </para>

                <programlisting language="php"><![CDATA[
/**
 * Bloco de documentação aqui
 */
class Foo
{
    /**
     * Bloco de documentação aqui
     */
    public function bar()
    {
        // todo conteúdo de função
        // deve ser identado quatro espaços
    }
}
]]></programlisting>

                <para>
                    Quando a lista de argumentos exceder o <link
                        linkend="coding-standard.php-file-formatting.max-line-length">comprimento
                        máximo de linha</link> você pode introduzir quebras de linha. Argumentos
                    adicionais à função/método devem ser identados um nível a mais que o da
                    declaração da função/método. Uma quebra de linha deve ser colocada antes do
                    parêntese de fechamento de argumentos, que deve então ser colocado na mesma
                    linha da chave de abertura da função/método com uma espaço separando os dois, e
                    no mesmo nível de identação da declaração da função/método. A seguir, um exemplo
                    de tal situação:
                </para>

                <programlisting language="php"><![CDATA[
/**
 * Bloco de documentação aqui
 */
class Foo
{
    /**
     * Bloco de documentação aqui
     */
    public function bar($arg1, $arg2, $arg3,
        $arg4, $arg5, $arg6
    ) {
        // todo conteúdo de função
        // deve ser identado quatro espaços
    }
}
]]></programlisting>

                <note>
                    <para>
                        O único mecanismo de passagem de parâmetro permitido em uma declaração de
                        método é a passagem por referência.
                    </para>
                </note>

                <programlisting language="php"><![CDATA[
/**
 * Bloco de documentação aqui
 */
class Foo
{
    /**
     * Bloco de documentação aqui
     */
    public function bar(&$baz)
    {}
}
]]></programlisting>

                <para>
                    Passagem por referência em tempo de chamada é estritamente proibido.
                </para>

                <para>
                    O valor de retorno não deve ser cercado por parênteses. Isto pode embaraçar a
                    legibilidade, além de quebrar o código caso um método seja modificado
                    posteriormente para retornar por referência.
                </para>

                <programlisting language="php"><![CDATA[
/**
 * Bloco de documentação aqui
 */
class Foo
{
    /**
     * ERRADO
     */
    public function bar()
    {
        return($this->bar);
    }

    /**
     * CERTO
     */
    public function bar()
    {
        return $this->bar;
    }
}
]]></programlisting>
            </sect3>

            <sect3 id="coding-standard.coding-style.functions-and-methods.usage">
                <title>Uso de funções e métodos</title>

                <para>
                    Argumentos de funções devem ser separados por um único espaço após a vírgula
                    delimitadora. A seguir, um exemplo de chamada aceitável de função que utiliza
                    três argumentos:
                </para>

                <programlisting language="php"><![CDATA[
threeArguments(1, 2, 3);
]]></programlisting>

                <para>
                    Passagem por referência em tempo de chamada é estritamente proibido. Veja na
                    seção de declaração de funções a maneira apropriada de passar argumentos de
                    função por referência.
                </para>

                <para>
                    Ao passar arrays como argumentos para uma função, a chamada da função pode
                    incluir a indicação "array" e pode ser quebrada em múltiplas linhas para
                    aumentar a legibilidade. Em tais casos, as instruções para a escrita de arrays
                    ainda se aplicam:
                </para>

                <programlisting language="php"><![CDATA[
threeArguments(array(1, 2, 3), 2, 3);

threeArguments(array(1, 2, 3, 'Zend', 'Studio',
                     $a, $b, $c,
                     56.44, $d, 500), 2, 3);

threeArguments(array(
    1, 2, 3, 'Zend', 'Studio',
    $a, $b, $c,
    56.44, $d, 500
), 2, 3);
]]></programlisting>
            </sect3>
        </sect2>

        <sect2 id="coding-standard.coding-style.control-statements">
            <title>Expressões de controle</title>

            <sect3 id="coding-standard.coding-style.control-statements.if-else-elseif">
                <title>If/Else/Elseif</title>

                <para>
                    Expressões de controle baseadas nos construtores <emphasis>if</emphasis> e
                    <emphasis>elseif</emphasis> devem ter um único espaço antes do parêntese de
                    abertura do condicional e um único espaço depois do parêntese de fechamento.
                </para>

                <para>
                    Dentro das expressões condicionais entre os parênteses, os operadores devem ser
                    separados por espaços para maior legibilidade. Parênteses aninhados são
                    encorajados a fim de melhorar o agrupamento lógico de expressões condicionais
                    maiores.
                </para>

                <para>
                    A chave de abertura deve ser escrita na mesma linha da expressão condicional,
                    enquanto a chave de fechamento deve sempre ser escrita na sua própria linha.
                    Qualquer conteúdo dentro das chaves deve ser indentado utilizando quatro
                    espaços.
                </para>

                <programlisting language="php"><![CDATA[
if ($a != 2) {
    $a = 2;
}
]]></programlisting>

                <para>
                    Se a expressão condicional fizer com que a linha exceda o <link
                        linkend="coding-standard.php-file-formatting.max-line-length">comprimento
                        máximo</link> e possuir várias cláusulas você pode quebrar a condicional em
                    várias linhas. Em tais casos, quebre a linha antes de um operador lógico e
                    indente a linha de forma a ficar alinhada abaixo do primeiro caractere da
                    cláusula condicional. O parêntese de fechamento no condicional será então
                    colocado em uma linha junto à chave de abertura com um espaço separando os dois,
                    em um nível de indentação equivalente ao da expressão de controle de abertura.
                </para>

                <programlisting language="php"><![CDATA[
if (($a == $b)
    && ($b == $c)
    || (Foo::CONST == $d)
) {
    $a = $d;
}
]]></programlisting>

                <para>
                    A intenção deste último formato de declaração é prevenir problemas ao adicionar
                    ou remover cláusulas da condicional durante revisões posteriores.
                </para>

                <para>
                    Para expressões "if" que incluem "elseif" ou "else", as convenções de formatação
                    são similares às do construtor "if". Os exemplos a seguir demonstram a
                    formatação apropriada para expressões "if" com construtores "else" e/ou
                    "elseif":
                </para>

                <programlisting language="php"><![CDATA[
if ($a != 2) {
    $a = 2;
} else {
    $a = 7;
}

if ($a != 2) {
    $a = 2;
} elseif ($a == 3) {
    $a = 4;
} else {
    $a = 7;
}

if (($a == $b)
    && ($b == $c)
    || (Foo::CONST == $d)
) {
    $a = $d;
} elseif (($a != $b)
          || ($b != $c)
) {
    $a = $c;
} else {
    $a = $b;
}
]]></programlisting>

                <para>
                    O <acronym>PHP</acronym> permite que expressões sejam escritas sem chaves em
                    algumas circunstâncias. Este padrão de codificação, no entando, não faz
                    diferenciação alguma -- todas expressões "if", "elseif" ou "else" devem utilizar
                    chaves.
                </para>
            </sect3>

            <sect3 id="coding-standards.coding-style.control-statements.switch">
                <title>Switch</title>

                <para>
                    Expressões de controle escritas com a expressão "switch" devem ter um único
                    espaço antes do parêntese de abertura da expressão condicional e após o
                    parêntese de fechamento.
                </para>

                <para>
                    Todo o conteúdo dentro da expressão "switch" deve ser indentado utilizando
                    quatro espaços e o conteúdo abaixo de cada expressão "case" deve ser indentado
                    utilizando quatro espaços adicionais.
                </para>

                <programlisting language="php"><![CDATA[
switch ($numPeople) {
    case 1:
        break;

    case 2:
        break;

    default:
        break;
}
]]></programlisting>

                <para>
                    O construtor <property>default</property> nunca deve ser omitido de uma
                    expressão <property>switch</property>.
                </para>

                <note>
                    <para>
                        Em alguns casos é útil escrever uma expressão <property>case</property> que
                        recai sobre a próxima omitindo um <property>break</property> ou
                        <property>return</property>. Para diferenciar tais casos de bugs, qualquer
                        expressão <property>case</property> onde o <property>break</property> ou o
                        <property>return</property> sejam omitidos devem conter um comentário
                        indicando que a quebra foi intencionalmente omitida.
                    </para>
                </note>
            </sect3>
        </sect2>

        <sect2 id="coding-standards.inline-documentation">
            <title>Documentação em linha de código</title>

            <sect3 id="coding-standards.inline-documentation.documentation-format">
                <title>Formato de documentação</title>

                <para>
                    Todos blocos de documentação ("docblocks") devem ser compatíveis com o formato
                    phpDocumentor. Descrever o formato phpDocumentor está além do escopo deste
                    documento. Para mais informações, visite: <ulink
                        url="http://phpdoc.org/">http://phpdoc.org/</ulink>
                </para>

                <para>
                    Todo arquivo de classe deve conter um docblock em nível de arquivo no topo de
                    cada arquivo e um docblock em nível de classe imediatamente acima da classe.
                    Exemplos de tais docblocks podem ser vistos abaixo.
                </para>
            </sect3>

            <sect3 id="coding-standards.inline-documentation.files">
                <title>Arquivos</title>

                <para>
                    Todo arquivo que contém código <acronym>PHP</acronym> deve ter um docblock no
                    topo do arquivo contendo no mínimo estas tags do phpDocumentor:
                </para>

                <programlisting language="php"><![CDATA[
/**
 * Descrição resumida do arquivo
 *
 * Descrição longa do arquivo (se houver)...
 *
 * LICENÇA: Informação sobre licença
 *
 * @category   Zend
 * @package    Zend_Magic
 * @subpackage Wand
 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license   BSD License
 * @version    $Id:$
 * @link       http://framework.zend.com/package/PackageName
 * @since      File available since Release 1.5.0
*/
]]></programlisting>

                <para>
                    A anotação <property>@category</property> deve ter o valor "Zend".
                </para>

                <para>
                    A anotação <property>@package</property> deve ser utilizada e deve ser
                    equivalente ao nome do componente da classe contida no arquivo. Tipicamente, o
                    nome do componente possuirá apenas dois segmentos, o prefixo "Zend" e o nome do
                    componente.
                </para>

                <para>
                    A anotação <property>@subpackage</property> é opcional. Caso informada, deve ser
                    o nome do subcomponente menos o prefixo da classe. No exemplo acima, assume-se
                    que a classe no arquivo ou é "<classname>Zend_Magic_Wand</classname>" ou utiliza
                    tal nome de classe como parte de seu prefixo.
                </para>
            </sect3>

            <sect3 id="coding-standards.inline-documentation.classes">
                <title>Classes</title>

                <para>
                    Toda classe deve ter um docblock que contenha no mínimo estas tags do
                    phpDocumentor:
                </para>

                <programlisting language="php"><![CDATA[
/**
 * Descrição resumida da classe
 *
 * Descrição longa da classe (se houver)...
 *
 * @category   Zend
 * @package    Zend_Magic
 * @subpackage Wand
 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license   BSD License
 * @version    Release: @package_version@
 * @link       http://framework.zend.com/package/PackageName
 * @since      Class available since Release 1.5.0
 * @deprecated Class deprecated in Release 2.0.0
 */
]]></programlisting>

                <para>
                    A anotação <property>@category</property> deve ter o valor "Zend".
                </para>

                <para>
                    A anotação <property>@package</property> deve ser informada e deve ser
                    equivalente ao componente a que a classe pertence; tipicamente, terá apenas dois
                    segmentos: o prefixo "Zend" e o nome do componente.
                </para>

                <para>
                    A anotação <property>@subpackage</property> é opcional. Caso informada, deve ser
                    o nome do subcomponente menos o prefixo da classe. No exemplo acima, assume-se
                    que a classe descrita ou é "<classname>Zend_Magic_Wand</classname>" ou utiliza
                    este nome como parte do seu prefixo.
                </para>
            </sect3>

            <sect3 id="coding-standards.inline-documentation.functions">
                <title>Funções</title>

                <para>
                    Toda função, incluindo métodos de objetos, deve possuir um docblock que contenha
                    no mínimo:
                </para>

                <itemizedlist>
                    <listitem><para>Uma descrição da função</para></listitem>
                    <listitem><para>Todos os argumentos</para></listitem>
                    <listitem><para>Todos os possíveis valores de retorno</para></listitem>
                </itemizedlist>

                <para>
                    Não é necessário utilizar a tag "@access" já que o nível de acesso é conhecido
                    através do modificador "public", "private" ou "protected" utilizado na
                    declaração.
                </para>

                <para>
                    Se uma função ou método pode disparar uma exceção, utilize @throws para todas as
                    classes de exceção:
                </para>

                <programlisting language="php"><![CDATA[
@throws exceptionclass [description]
]]></programlisting>
            </sect3>
        </sect2>
    </sect1>
</appendix>
<!--
vim:se ts=4 sw=4 et:
-->