Variables

camelCase para variables normales y parámetros de funciones/métodos:

$id
$name
$usuarios
$usuario
$data

Arrays siempre con array():

$usuarios = array();

Funciones y métodos

Nombres en camelCase:

function getUsers(): array { ... }
public function createUser(array $data): array { ... }

Métodos de clases siguen la misma convención.
Funciones y métodos cortos y de responsabilidad única.

Clases

Nombres en PascalCase:

class UserService { ... }
class UserDAO { ... }

Propiedades de una clase en camelCase:

private UserDAO $dao;

Control de flujo

Llaves en la misma línea de la declaración (estilo C-like):

if ($id !== 0) {
}

Condicionales: primero el caso positivo, luego el falso:

if ($id !== 0) {
    echo json_encode(getUserById($id));
} else {
    echo json_encode(getUsers());
}

Comparaciones estrictas === y !== en condicionales relevantes.

Casting

Solo cuando es necesario, principalmente para entradas externas o retornos:

$id = (int) $_GET["id"];
return array("id" => (int)$id, "name" => $name);

Estilo general

Sintaxis clásica y explícita, sin atajos ni abreviaturas (?:, ??).
Indentación y llaves consistentes, estilo C-like.
Variables descriptivas y funciones/métodos de responsabilidad única.
Uso estricto de type hints en parámetros y declaraciones de retorno.
Retornos siempre únicos de un tipo, sin ambigüedad (ejemplo: siempre array, nunca array|false|null).