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.