🧠 – Wann snake_case, wann camelCase, wann mischen?
In der modernen Softwareentwicklung geht es längst nicht mehr darum, eine einzige richtige Schreibweise zu haben.
Vielmehr hängt die Wahl des Namensstils von drei Faktoren ab:
- 🧩 Dem System oder Framework, in dem du arbeitest
- ⚙️ Der Programmiermethode (prozedural, objektorientiert, funktional)
- 👨💻 Deinem persönlichen oder Team-Stil
🐍 vs 🐫 – Die zwei Klassiker
| Stil | Beispiel | Beschreibung |
|---|---|---|
snake_case | get_user_data() | Wörter durch Unterstriche getrennt – klassisch, klar lesbar |
camelCase | getUserData() | Wörter zusammengeschrieben, jedes Wort groß außer das erste |
PascalCase | GetUserData() | Wie camelCase, aber erster Buchstabe groß – meist für Klassen |
UPPER_CASE | MAX_FILE_SIZE | Für Konstanten, global eindeutig |
⚙️ Pro Sprache – was ist üblich?
| Sprache / System | Empfohlener Stil | Beispiel |
|---|---|---|
| 🐘 PHP (WordPress / Moodle / Drupal) | snake_case | get_user_meta() |
| 🐘 PHP (Laravel / Symfony / modern OOP) | camelCase | $user->getUserData() |
| 🟨 JavaScript / TypeScript / React / Node | camelCase | getUserData() |
| 🐍 Python | snake_case | get_user_data() |
| ☕ Java / C# / Kotlin | camelCase (Methoden), PascalCase (Klassen) | getUserData(), class UserData |
| 🐹 Go (Golang) | CamelCase | GetUserData() (für exportierte Funktionen) |
🧱 WordPress & Moodle: warum snake_case
Systeme wie WordPress und Moodle basieren auf älteren PHP-Strukturen mit vielen globalen Funktionen.
Daher ist dort snake_case Standard – besonders bei:
🔹 Hooks
🔹 Actions / Filters
🔹 Callback-Funktionen
🔹 Globalen Helpern
Beispiel:
add_action('init', 'register_custom_post_type');
function register_custom_post_type() {
// ...
}
👉 Technisch funktioniert camelCase auch,
aber der Core und fast alle Plugins verwenden snake_case.
Deshalb bleibt es hier die richtige Wahl.
🧠 Moderne Mischung = der ideale Mittelweg
✨ „Schreib im Stil des Systems – aber nutze intern moderne Konventionen.“
| Bereich | Stil | Beispiel |
|---|---|---|
| 🔸 Hooks / Actions / Filters | snake_case | add_action('init', 'register_custom_post_type') |
| 🔸 Callback-Funktionen | snake_case | function register_custom_post_type() { ... } |
| 🔸 Klassen / Methoden | camelCase + PascalCase | class UserService { public function registerNewUser() { ... } } |
| 🔸 Variablen | camelCase | $userName, $emailAddress |
| 🔸 Konstanten | UPPER_CASE | MAX_UPLOAD_SIZE |
Beispiel: Modern gemischt in PHP
// WordPress Hook (muss snake_case bleiben)
add_action('init', 'register_custom_post_type');
// Callback (snake_case)
function register_custom_post_type() {
$userService = new UserService();
$userService->registerNewUser('Ali', 'ali@example.com');
}
// Moderne Klasse (camelCase)
class UserService {
public function registerNewUser($name, $email) {
// interne Logik
}
}
🟢 Ergebnis:
Außen kompatibel mit WordPress, innen sauberer, moderner PHP-Code.
🧠 Programmiermethoden und Stilwahl
| Methode | Typischer Stil | Beispiel |
|---|---|---|
| Prozedural / funktional | snake_case | get_user_data() |
| Objektorientiert (OOP) | camelCase / PascalCase | $this->getUserData() |
| Hybrid (z. B. WP + eigene Klassen) | Mischung | Hooks: snake_case → intern: camelCase |
📂 Dateinamen & Ordnerstruktur
Auch bei Dateinamen gelten klare, aber kontextabhängige Regeln.
Der Stil hängt davon ab, in welcher Sprache oder Umgebung du arbeitest.
| 💻 Umgebung | 📄 Empfohlener Stil | 🧩 Beispiel | 🧠 Hinweis |
|---|---|---|---|
| 🐍 Python (Module) | snake_case | user_service.py | Laut PEP 8, Bindestriche nicht erlaubt (import user-service → Fehler) |
| 🐍 Python (Pakete / PyPI-Namen) | kebab-case | my-awesome-package | Für Distributionsnamen (pip install my-awesome-package) |
| 🐘 PHP / WordPress / Moodle | snake_case | user_service.php | Klassischer PHP-Stil |
| 🐘 PHP (modern OOP / Frameworks) | kebab-case | user-service.php | In Frameworks wie Laravel oder Symfony üblich |
| 🟨 JavaScript / TypeScript / Node / React | kebab-case | user-service.js | URL- und build-freundlich, Standard im Web |
| ☕ Java / C# / Kotlin | PascalCase | UserService.java | Klassenname = Dateiname |
| 🐹 Go (Golang) | snake_case | user_service.go | Exportierte Funktionen dagegen in CamelCase |
💡 Kurz gesagt:
📄 Dateien & Ordner:
- 🐍 Python →
snake_case- 🌐 Web & JS →
kebab-case- ☕ Klassenbasierte Sprachen →
PascalCase
⚙️ Autoloader & Klassennamen
Wenn dein Projekt einen Autoloader verwendet (z. B. PHP PSR-4, Java, C#),
müssen Klassennamen und Dateinamen exakt übereinstimmen,
damit die automatische Lade-Logik funktioniert.
Autoloader suchen Klassen nach ihrem Namespace und Dateipfad –
jede Abweichung (Bindestrich, falsche Großschreibung, anderer Stil) führt zu Fehlern.
🐘 PHP – PSR-4 Beispiel
Klassendefinition:
namespace App\Services;
class UserService {
public function registerNewUser() { ... }
}
Dateistruktur (PSR-4-konform):
/src
└── Services
└── UserService.php
🧠 Der PSR-4-Autoloader sucht automatisch nach einer Datei,
deren Pfad dem Namespace + Klassennamen entspricht:App\Services\UserService → /src/Services/UserService.php
Wenn die Datei stattdessen user-service.php oder user_service.php hieße,
würde der Autoloader die Klasse nicht finden.
☕ Java / C# / Kotlin – gleiche Logik
public class UserService {
// ...
}
📄 Dateiname: UserService.java
Java verlangt das explizit:
class UserService is public, should be declared in a file named UserService.java
🧩 Übersicht: Autoloader & Namenskonventionen
| Sprache / System | Autoloader / Mechanismus | Klassenname = Dateiname? | Beispiel |
|---|---|---|---|
| 🐘 PHP (PSR-4 / Composer) | Namespace-basiert | ✅ Ja | App\Services\UserService → /src/Services/UserService.php |
| ☕ Java | JVM-Classloader | ✅ Ja | UserService.java |
| 🧩 C# / .NET | CLR / Assemblies | ⚙️ Empfohlen | UserService.cs |
| 🐍 Python | Kein Autoloader, aber Imports | ⚙️ Modulname = Dateiname | import user_service → Datei user_service.py |
| 🟨 JavaScript / TypeScript | Module-Import | ⚙️ Empfohlen | import { UserService } from './UserService.js' |
💡 Merksatz:
🔧 Wenn dein Projekt Autoloading nutzt,
müssen Klassennamen und Dateinamen exakt übereinstimmen,
inklusive Groß-/Kleinschreibung und Namespace-Struktur.In dynamischen Sprachen ohne Autoloader (z. B. Python, JS) gilt:
Nutze den Stil, der im System Standard ist – aber bleib konsequent.
✅ Fazit
🧭 Modern heißt heute:
Nicht dogmatisch, sondern kontextbewusst.
🐍 Verwende snake_case, wenn du mit Systemen arbeitest, die darauf basieren (WordPress, Moodle, ältere PHP-Systeme).
🐫 Verwende camelCase für moderne, objektorientierte oder JavaScript-lastige Projekte.
📄 Verwende kebab-case für Dateinamen in Webprojekten oder Framework-Strukturen.
🏛️ Verwende PascalCase, wenn dein Autoloader oder Framework Klassennamen verlangt, die Dateinamen entsprechen.
🎯 Bleib konsequent innerhalb eines Projekts.
⚡ Kombiniere intelligent, wenn du Systeme mischst.
🧾 Kurz zusammengefasst
| Bereich | Empfohlener Stil | Beispiel |
|---|---|---|
| WordPress / Moodle Hooks | snake_case | add_action('init', 'register_custom_post_type') |
| Moderne PHP-Methoden | camelCase | $this->getUserData() |
| Klassen | PascalCase | class UserService {} |
| Konstanten | UPPER_CASE | MAX_UPLOAD_SIZE |
| Variablen | camelCase | $userName |
| Python (Code) | snake_case | get_user_data() |
| Python (Dateien) | snake_case | user_service.py |
| JavaScript | camelCase | getUserData() |
| Dateien (Web / JS) | kebab-case | user-service.js |
| PHP / Java / C# Klassen-Dateien | PascalCase | UserService.php |
🚀 Fazit in einem Satz
💬 Schreib Code so, dass er aussieht, als hätte ihn jemand geschrieben, der das System verstanden hat.
Nicht zu starr, nicht zu chaotisch – sondern stilbewusst und modern.