No, je to zajímavé, jak PHP funguje na některé lidi jako červený hadr na býka...
Ja nehatujem PHP, teraz si robím svoj projekt z vlastného rozhodnutia v Symfony. Ako PHPčkar, skús nám radšej povedať, čo s nasledovnými problémami:
a) Máme Symfony controller a v ňom sa pripájame cez DBAL na databázu.
Je potrebné nejako explicitne
uzatvoriť objekt connection? Vraj netreba, lebo PHP má všetko na konci cyklu request/response uzavrieť, ale nejako sa mi to nezdá. V Jave poctivo voláme na objekte connection close metódu.
/**
* @Route("/getdata", name="getdata")
*/
public function data(Connection $conn)
{
$data = $conn->fetchAll("SELECT * FROM countries LIMIT 5");
return $this->json([
'data' => $data
]);
}
b) Nasledujúci kód je populárnej PHP knihy od Robina Nixona, https://www.amazon.com/Learning-PHP-MySQL-JavaScript-Javascript/dp/1491978910/ref=dp_ob_title_bk<?php
$fh = fopen("testfile.txt", 'r') or die("File does not exist or you lack permission to open it");
$line = fgets($fh);
$fclose($fh);
$echo $line;
Žiadne ošetrenie chybových stavov. Prepokladám, že
die() funkciu nebudeme volať pri webovom projekte, v CLI by to šlo. Zrejme treba ošetriť chybové stavy testovaním návratových hodnôt funkcií fopen, fgets, a fclose. Ako z toho urobiť kóšer príklad?
c) Používať try/catch v kotrolleri alebo nie? Podľa PHP delusions
https://phpdelusions.net/delusion/try-catch treba
použiť try/catch len v zriedkavých prípadoch, inak to treba nechať doplávať do systémového kódu, ktorý by mal vygenerovať error page.
$fs = new Filesystem();
try {
$pd = $this->get('kernel')->getProjectDir();
$content = file_get_contents($pd . '/templates/' . $filename);
return $this->render('admin/edit_article.html.twig',
['aid'=> $aid, 'title'=>$title, 'slug'=> $slug, 'filename'=>$filename,
'tags'=> $tags, 'content'=>$content]);
} catch (IOExceptionInterface $ex) {
$ermsg = "Cound not find the file to edit" . $ex->getPath();
return new Response($ermsg, Response::HTTP_CONFLICT,
['content-type' => 'text/plain']);
}
Ja som primárne Javista. V Java sa viem obvykle dopátrať ku best practices, v PHP sa mi to zdá viac zamotané .