You can use simple tricks like:
- Givens should be in the past tense
- Whens should be in the present tense
- Thens should be in the future tense (often using "should" or "will")
Tips to write Behat like tests.
New readonly property feature coming up with PHP 8.1. I still like me some getters, though. But it could be useful in DTO as mentioned in the article.
#PHP Enums vote closes today: 44 yes an 7 no; enums are coming in PHP 8.1!
Un article d'introduction sur les mutation tests en PHP, avec Infection.
Pour avoir déjà joué avec, c'est assez fun, et ça permet de se poser pas mal de questions sur la qualité de notre code. Par contre, c'est très chronophage.
An Enum RFC for PHP was just created! Please pass!
TL;DR
PHP 8.0 a été release et est disponible au téléchargement.
Un article de #blog pour faire le tour des nouveautés des nouveautés.
🇫🇷 PHP 8.0 est sorti ! Quoi de neuf, Docteur ?
🇺🇸 PHP 8.0 is out! What’s up, Doc?
Pour débugger une requête Guzzle.
Une bibliothèque PHP qui a pour vocation de retourner les jours fériés de chaque pays. Ambitieux.
Could be useful if you have legacy projects that require composer 1.x for some reason.
Aujourd'hui, c'est cadeau, c'est pour moi: une api permettant de créer une image à partir d'un texte, genre pour pimper un peu une citation (d'où le nom fancytation... gag)
Very well written article about composition over inheritance in OOP.
Also the introduction example reminds me about a bunch of projects I had to work on:
Alan Kay, the inventor of the term “object-oriented programming”, told a story once during a talk more than 20 years ago. You can build a dog house using only a hammer, nails, planks, and just a little bit of skill. I figure even I would be able to build it given enough time. Once you've built it you've earned the skills and know-how, and could apply it to other projects. Next, you want to build a cathedral, using the same approach with your hammer, nails, and planks. It's a 100 times larger, but you've done this before — right? It'll only take a little longer.
While the scale went up by a factor of 100, its mass went up by a factor of 1.000.000 and its strength only by 10.000. Inevitably, the building will collapse. Some people plaster over the rubble, make it into a pyramid and say it was the plan all along; but you and I know what really went on.
Un outil pour faire des jolis menu en CLI en PHP. Je me garde ça sous le coude, ça pourrait être intéressant couplé à des commandes Symfony.
A set of good practices for PHP arrays and collection objects. Nothing revolutionary, but these are very good guidelines for any project.
🧟
Neat.
Enqueue is production ready, battle-tested messaging solution for PHP. Provides a common way for programs to create, send, read messages.
Supports major brokers such as RabbitMQ, Kafka, Amazon SQS, Google PubSub, Redis etc.
Le préchargement de fichier en PHP a l'air prometteur, avec des gains de performances ~15% sur les premiers benchmarks. Avec un préchargement automatique via composer, ça pourra devenir intéressant pour certains usages ; en particulier des micro-services qui doivent gérer un volume important de requêtes.
Un outil tout simple pour faire des quiz en ligne : reveal.js pour un effet slides et un backend PHP. J'aime bien.
Pas mal de trucs intéressants !
Notamment niveau simplification de syntaxe, on a
array_map(function (User $user) {
return $user->id;
}, $users);
// peut s'écrire
array_map(fn(User $user) => $user->id, $users);
$data['date'] = $data['date'] ?? new DateTime();
// peut s'écrire
'date'] ??= new DateTime();
Une bibliothèque simple en PHP pour la gestion des adresses IP, avec tout un tas de helpers.
Ça sert toujours, et en plus elle supporte Doctrine.
Static analysis tools for PHP
(liste)
Une bibliothèque PHP qui permet de charger le DOM, et propose ensuite une API comprenant les sélecteurs jQuery, les requêtes XPath, etc.
Ce lien est à garder bien au chaud : une longue liste de bibliothèques PHP pour tous les usages, du Framework au HTML purifier en passant par le parser d'URL.
J'ai eu quelques soucis avec Travis CI pour des tests de bout en bout d'un outil qui manipule des images en PHP.
En gros, j'ai :
Tout marchait bien en local, mais lors de l'exécution des tests Travis, toutes les images étaient différentes. À l’œil nu, c'était bien les même, mais les binaires n'étaient pas identiques.
Il s'avère qu'il suffit d'avoir une version légèrement différente de php-gd
pour que les images générées soient différentes, par exemple une amélioration de l'encodage. Merci cet article du blog de Piwik pour m'avoir mis sur la piste.
De fait, la solution est assez simple : recréer à la volée les images attendues avec PHP GD (et donc la même version que celle utilisée par la moulinette). Attention, il faut bien ré-utiliser toutes les fonctions utilisée dans la manipulation des images pour arriver au bon résultat.
En bonus, un petit snippet :
/**
* Duplicate expected images using the current GD version.
*
* Different versions of GD will result in slightly different images,
* which would make the comparaison test fail. By regenerating expected thumbs,
* the expected and actual result should be the same.
*
* @param string $image relative path of the expected thumb inside the expected thumb directory.
* @param bool $crop Set to true to apply the crop function.
*
* @throws \Exception couldn't create the image.
*/
public function regenerate($image, $crop = false)
{
$targetFolder = dirname(self::$regenerated . $image);
if (! is_dir($targetFolder)) {
mkdir($targetFolder, 0755, true);
}
$content = file_get_contents(self::$expected . $image);
$sourceImg = @imagecreatefromstring($content);
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($width, $height);
if (! imagecopyresized(
$targetImg, $sourceImg,
0, 0, 0, 0,
$width, $height, $width, $height
)
) {
@imagedestroy($sourceImg);
@imagedestroy($targetImg);
throw new \Exception('Could not generate the expected image from source image.');
}
if ($crop) {
$targetImg = imagecrop($targetImg, [
'x' => 0,
'y' => 0,
'width' => $width,
'height' => $height
]);
}
$target = self::$regenerated . $image;
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);
}
Container is a small but powerful dependency injection container that allows you to decouple components in your application in order to write clean and testable code.
C'est bon à savoir. La fonction uniqid()
de PHP s'appuie sur l'heure. Pour éviter les collisions, elle met donc le thread en pause avec une microseconde (usleep(1)). Si vous savez un peu comment fonctionne un CPU, ça peut en fait être un peu plus, en fonction de sa fréquence, ce qu'il fait à côté, etc. Du coup, dans une boucle, une pause de ce genre peut commencer à avoir un impact non négligeable sur les performances.
Conclusion, il faut toujours appeler cette fonction avec le paramètre $more_entropy
pour éviter de passer par cette pause.
Un groupe de hacker a réussi à avoir un contrôle distant complet sur les serveurs Pornhub en découvrant deux failles 0-day sur PHP ; sachant que c'est un secteur qui ne lésine pas sur la sécurité vu que la concurrence n'est pas toujours très réglo.
Pour résumer :
Ils ont découvert qu'il était possible de définir un cookie, qui fait appel à la fonction PHP unserialize()
, via une simple requête. À partir de là, ils ont utilisé un fuzzer pour détecter d'éventuelles anomalies dans le comportement de unserialize()
. Ils en ont trouvé et, suite à analyse, ils ont découvert un bug dans l'algorithme du garbage collector de PHP.
Ce bug, appelée faille « use-after-free » (utilisation de la mémoire après qu'elle soit libérée), leur a permis d'exécuter du code à distance directement sur le serveur, via des techniques de manipulation de mémoire auxquelles je ne comprends pas tout. Et résultat des courses, ils ont pu faire un dump complet de la base de données et accès au code source de pornhub.
Sacrément balaise ! Ils ont bien mérité leur prime de $20.000.
C'était en juin, vérifiez que vos versions de PHP sont à jour.
via http://lehollandaisvolant.net/?id=20160725122057 - Rien à voir avec la gestion des fichiers par contre.
Yet another PHP CMS.
Stockage directement en fichiers, et il a de la gueule.
Intéressant. Des statistiques sur les conventions de codes appliquées sur un ensemble de projets PHP.
Globalement, je suis dans la majorité, c'est plutôt bon signe.
Une librairie/framework PHP qui prend en charge tout le système d'authentification et d'autorisations.
Ça peut permettre d'éviter d'avoir à ré-inventer la roue, et surtout d'avoir des trous dans la raquette niveau sécurité.
Optimisation nginx pour Symfony.
Un outil PHP qui permet de faire des releases automatiquement.
Peut-être intéressant sur de l'intégration continue.
scalar objects en PHP, sous le coude
Un émulateur de Gameboy en PHP. Quand même oui.
Un loooong article sur les bonnes pratiques en PHP.
Le début n'est pas passionnant, mais il y a quelques chapitres par la suite qui ont l'air de valoir d'être lu.
http://bookmarks.ecyseo.net/?2PYqgQ
Des recommandations pour PHP.
Y'a plein de bonnes choses : du coding style (PSR-2) histoire d'avoir un code cohérent, les recommandations d'autoloading, etc.
Dans les drafts, également : une standardisation pour PHPDoc, des conseils de sécurité et surtout...
Huggable Interface :
:)
via http://lien.shazen.fr/?8ArLvQ
Je voudrais aussi préciser que faire tourner un benchmark comme ça, sans préciser une seule fois la version de PHP, ça ne vaut pas un clou.
Beaucoup de choses peuvent changer d'une version à l'autre, en particulier l'implémentation d'une fonction donnée.
Sur cette page, le header de la réponse HTTP indique que c'est du 5.5.9 (release en janvier 2014).
PHP 5.6 est en version stable depuis plus d'un an, et il me semble que PHP 7 est prévu en stable avant la fin de l'année.
Un tuto qui explique comment gérer proprement les libs front (CSS / JS) sur Symfony. C'est très clair, même pour le noob de bower que je suis.
Ces derniers jours j'ai travaillé sur une petite bibliothèque qui se charger d'aller découvrir les favicons d'un site à partir d'une URL.
J'ai rajouté quelques trucs pour avoir un taux de réussite plus important que celui de la lib d'origine ou que celui du service Google utilisé par la River.
Et je l'ai rendu compatible avec Composer : https://packagist.org/packages/arthurhoaro/favicon
Si vous avez un Shaarli, vous pouvez voir ce que ça donne avec votre favicon ici : https://river.hoa.ro/network.php
Et pour la version officielle, c'est au bon vouloir de Nexen. :)
https://github.com/mknexen/shaarli-api/pull/4