Namespaces
Namespaces verhindern Namenskonflikte und spiegeln die Ordnerstruktur wider:
<?php
namespace Shop\Modell {
class Produkt
{
public function __construct(public string $name) {}
}
function hilfe(): string { return __FUNCTION__; }
const VERSION = "1.0";
}
namespace {
use Shop\Modell\Produkt;
use Shop\Modell\Produkt as P;
use function Shop\Modell\hilfe;
use const Shop\Modell\VERSION;
$p = new Produkt("Stift");
echo $p::class, " ", (new P("Heft"))->name, " ", hilfe(), " ", VERSION, " ", \strlen("abc"), "\n";
}Ausgabe
Shop\Modell\Produkt Heft Shop\Modell\hilfe 1.0 3
Composer
Composer ist der Paketmanager von PHP (packagist.org). Er installiert Bibliotheken und stellt einen Autoloader bereit:
composer init # composer.json anlegen
composer require monolog/monolog # Paket hinzufügen
composer install # alles gemäß composer.lock installieren
composer update # neuere Versionen holen
composer dump-autoload # Autoloader neu erzeugenDie Datei composer.json:
{
"name": "meine/app",
"require": { "php": ">=8.2", "monolog/monolog": "^3.0" },
"require-dev": { "phpunit/phpunit": "^11.0" },
"autoload": { "psr-4": { "App\\": "src/" } }
}PSR-4 bedeutet: Die Klasse App\Dienst\Mailer liegt in src/Dienst/Mailer.php. In deinem Einstiegsskript lädst du alles mit:
<?php
require __DIR__ . "/vendor/autoload.php";
use App\Dienst\Mailer;
(new Mailer())->sende("mia@example.com");Wichtige Standards der PHP-FIG: PSR-1/12 (Code-Stil), PSR-4 (Autoloading), PSR-7 (HTTP-Nachrichten), PSR-3 (Logger), PSR-11 (Container).
Beliebte Pakete und Frameworks
| Zweck | Paket |
|---|---|
| Framework | Laravel, Symfony, Slim |
| Templates | Twig, Blade |
| Datenbank-ORM | Eloquent, Doctrine |
| HTTP-Client | Guzzle, Symfony HttpClient |
| Logging | Monolog |
| Tests | PHPUnit, Pest |
| Statische Analyse | PHPStan, Psalm |
| Code-Stil | PHP-CS-Fixer, PHP_CodeSniffer |
Tests mit PHPUnit
<?php
use PHPUnit\Framework\TestCase;
use App\Rechner;
final class RechnerTest extends TestCase
{
public function testAddition(): void
{
$this->assertSame(5, (new Rechner())->addiere(2, 3));
}
/** @dataProvider paare */
public function testQuadrat(int $in, int $erwartet): void
{
$this->assertSame($erwartet, (new Rechner())->quadrat($in));
}
public static function paare(): array
{
return [[2, 4], [3, 9], [-4, 16]];
}
public function testFehler(): void
{
$this->expectException(\DivisionByZeroError::class);
(new Rechner())->teile(1, 0);
}
}Starten: vendor/bin/phpunit. Du brauchst nicht zwingend ein Framework, um Tests zu schreiben: Ein selbstgebauter Mini-Testlauf zeigt das Prinzip:
<?php
function pruefe(string $name, callable $test): void
{
try {
$test();
echo "OK $name\n";
} catch (Throwable $e) {
echo "FAIL $name: ", $e->getMessage(), "\n";
}
}
function gleich($erwartet, $ist): void
{
if ($erwartet !== $ist) throw new Exception("erwartet " . var_export($erwartet, true) . ", erhalten " . var_export($ist, true));
}
pruefe("addition", fn() => gleich(5, 2 + 3));
pruefe("strings", fn() => gleich("ABC", strtoupper("abc")));
pruefe("absichtlich falsch", fn() => gleich(4, 2 + 3));Ausgabe
OK addition OK strings FAIL absichtlich falsch: erwartet 4, erhalten 5
Werkzeuge für Qualität
vendor/bin/phpstan analyse src --level=8 # findet Typfehler ohne Ausführung
vendor/bin/php-cs-fixer fix # formatiert nach PSR-12
php -l datei.php # Syntax prüfenMerke
- Namespaces ordnen Klassen;
useimportiert - Composer verwaltet Pakete und bietet den PSR-4-Autoloader (
vendor/autoload.php) - Wichtige Standards: PSR-4, PSR-12
- PHPUnit/Pest für Tests, PHPStan/Psalm für statische Analyse
- Frameworks: Laravel, Symfony
Aufgabe
Lege mit composer init ein Projekt mit PSR-4-Autoloading an, schreibe eine Klasse in src/ und rufe sie auf.