We don't want you to waste time when you program, so we follow the principles of Conventions Over Configuration.
Following these rules will also make it easier to maintain your code in the future by other developers.
Here are the most important rules:
- KISS - Keep it simple, stupid
- YAGNI - You Arent Gonna Need It
- DRY - Don’t repeat yourself
- SOLID - The First 5 Principles of Object Oriented Design
- The Boy Scout Rule - Leave your code better than you found it
- Use english names only (class names, method names, comments, variables names, database table and field names, etc…).
- Use class suffixes / prefixes according to PSR Naming Conventions.
- Follow industry best practices for your directory and file structure:
- thephpleague/skeleton - A skeleton repository for packages
- pds/skeleton - Names for your root-level directories
-
Table names should be singular, e.g. when we have a User entity class, the table in the database should be named
user
by default. See the reasoning behind it here -
Entity property names are used for column names.
-
Entity properties that are named ID or classname ID are recognized as primary key properties.
-
A property is interpreted as a foreign key property if it's named
<navigation property name><primary key property name>
(for example, StudentID for the Student navigation property since the Student entity's primary key is ID). Foreign key properties can also be named the same - simply<primary key property name>
(for example, EnrollmentID since the Enrollment entity's primary key is EnrollmentID).
- All methods must have type declaration and return type declaration.
- Methods without return statement must declared with
void
as their return type. - Class properties must have typed properties (PHP 7.4+).
- Don’t mix data types for parameters and return types, except for
nullable
. - Don’t
extend
classes or createabstract
classes for the sake of “code reuse”, except for traits with test code only. - Create
final
classes by default, except you have to mock it (e.g. repositories). - Create
private
methods by default. Don’t createprotected
methods. - All method parameters must be used.
- Use composition over inheritance.
- Declare all class dependencies only within the constructor.
- Don’t inject the container (PSR-11). The service locator is an anti-pattern.
- A constructor can accept only dependencies as object.
- Scalar data types (string, int, float, array) are not allowed for the constructor. Pass them as parameter object.
- Use a static code analyzer to detect bugs and errors. For example:
- Object Design Style Guide
- Hexagonal Architecture
- http://bestpractices.thecodingmachine.com/
- https://odan.github.io/learn-php/
- For files that are uploaded by users, each module should use the
/uploads
folder
In this section we used materials from various authors, incl. Daniel Opitz