Este artigo discute uma abordagem para escrever e escrever código PHP. Os seguintes pontos foram formados analisando as abordagens existentes da empresa e a experiência pessoal.
Regras para nomear arquivos e pastas
Todos os nomes de pastas e arquivos devem ser significativos e falantes (sem exigir explicações adicionais).
Pastas
Todas as pastas são nomeadas em minúsculas com separação de palavras usando o -
sinal de menos.
Se a pasta contiver classes que pertencem ao espaço para nome (espaço para nome), a pasta será nomeada de acordo com o espaço para nome (espaço para nome).
Caracteres permitidos para nomear pastas: letras latinas e um -
sinal de menos.
arquivos
Todos os arquivos relacionados ao projeto são nomeados em letras minúsculas com separação de palavras usando o símbolo -
(menos).
Se o arquivo for um arquivo de classe, ele será nomeado de acordo com o nome da classe.
Convenções de nomenclatura para namespaces, classes, métodos e variáveis
Todos os nomes devem ser significativos e falantes (sem exigir explicações adicionais).
Namespaces
. , .
PascalCase
. PascalCase
.
Trait
. Interface
. Abstract
.
camelCase
. camelCase
, .
:
- , ,
(isPostRequest
, getRequestType
, parseSchemaElement
, renderPageWithSetupsAndTeardowns
) boolean
is
, has
can
camelCase
. camelCase
, .
UPPER_CASE_SNAKE_CASE
. UPPER_CASE_SNAKE_CASE
, .
:
, ,
. Map
($typesMap
, $statesMap
), .. .
, (unpaidProject
)
, , (userIsAdmin
, messageIsSend
, figureCanBePainted
, projectName
)
, ,
:
$object->expire_at
$object->setExpireAt($date);
$object->getExpireAt();
:
$object->expiration_date;
$object->setExpirationDate($date);
$object->getExpirationDate();
boolean
is
, has
can
:
if ($project->isInvalid()) {
}
if ($project->isNotValid()) {
}
if ($accessManager->isAccessDenied()) {
}
:
if (!$project->isValid()) {
}
if (!$accessManager->isAccessAllowed()) {
}
if ($accessManager->canAccess()) {
}
( 8 ), : , ), (userHasRoleAdmin
, statusIsActive
)
(namespace), ( ). (use
).
{...}
. .
.
:
- .
- / — .
.
, .
.
.
class InterfaceType {
private $property = 'myProp';
public function getProperty():string {
return $this->property;
}
}
(return
) , .
, () .
:
if (IS_REGISTRATOR() && (($params.status === 'W' || $params.status === 'D' || $params.status === 'A') && $params.remark && (($params.subres_level == 0 && ($user_info->selected_title->tid == $params.boss || $user_info->selected_title->tid == $doc_signer_tid || !$params.usertid) || $params.subres_level > 0 && $user_info->selected_title->tid == $params.usertid))) { ... }
:
$docIsInWorkAcceptOrDraft = ...;
$bossHasSignerPriviledge = ...;
$userCanSign = ...;
if ($docIsInWorkAcceptOrDraft && $bossHasSignerPriviledge && $userCanSign) {
}
( ""). , , .
, PHPDoc. - .
//
, /*...*/
.
, , .
, , declare(strict_types=1);
/ null
. 0
.
function sendEmail(string $title, string $message = null, string $date = null): void {
}
$object->sendEmail('Title', null, '2017-01-01');
$object->sendEmail('Title', '', '2017-01-01');
, ( — ).
. array_key_exists
, isset
. . .
. , :
- .
\n
, \r
, \t
..
, (: type
). PHPDoc. , c check
validate
, .
private
. , protected
. , public
.
null
, Null object, , (: ).
json
— return true
, return ['success' => ['message' => '.....']]
['error' => ['message' => '.....']]
. message
, .
.
. . , .
boolean
. boolean
(===
), .
:
if ($user) {
}
if ($request->postData('amount') == 100) {
}
if (!$request->postData('amount')) {
}
:
if ($user === null) {
}
if ((int)$request->postData('amount') === 100) {
}
if ($booking->comment === '') {
}
Ao usar os operadores AND e OR ao mesmo tempo em uma expressão condicional, é necessário dar prioridade aos colchetes.