Je m'appelle Julien Deniau
Je suis un vieux… codeur
J'ai codé mes premiers sites :
echo '<html>'; // et c'est parti !
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
PHP Parse error: syntax error, unexpected '$a' (T_VARIABLE) on line 6
đź‘Ť voyager
♥ avec une carte
👍 découvrir
♥ comprendre avec un dictionnaire
đź‘Ť construire
♥ manuel
Je suis un aventurier
Je suis un explorateur.
Aventurier : seul avec ses bytes et son couteau
Explorateur : aller fouiller avec les outils adaptés
PHP 7 : structuration du langage, typage statique
Plus de méthode avec paramètre inconnu !
Type error: Argument 1 passed to slugify()
must be of the type string or null, integer given
↓
class Foo {
private $bar; // considéré comme "@mixed"
public function __construct(array $bar) {
$this->bar = $bar;
}
public function getBar() {
return strtoupper($this->bar);
}
}
$foo = new Foo(['io']);
$foo->getBar();
class Foo {
/**
* @var array
*/
private $bar;
public function __construct(array $bar) {
$this->bar = $bar;
}
public function getBar() {
return strtoupper($this->bar);
}
}
$foo = new Foo(['io']);
$foo->getBar();
function sayHello(string $who): string {
return 'Hello ' . strtoupper($who);
}
$julien = new User('julien');
sayHello($julien);
interface FooInterface {}
class Foo implements FooInterface {
public function bar() {
// do stuff
}
}
function dumpFoo(FooInterface $fooInterface) {
return $fooInterface->bar();
}
$foo = new Foo();
dumpFoo($foo);
use Doctrine\Common\Persistence\ObjectManager;
function doStuff(ObjectManager $entityManager)
{
return $entityManager->createQueryBuilder()
->from('SomeEntity', 'a')
->where('a.id = 8')
->getResult();
}
ObjectManager
n'a pas de méthode
createQueryBuilder
.
Doctrine\ORM\EntityManagerInterface
class Foo { public $id = 1; }
function getFoo(): Foo
{
return new Foo();
}
$foo = getFoo();
if ($foo) {
var_dump($foo->id);
}
$a = (int) 8 % 3;
function div(int $a, int $b): int {
return round($a / $b);
}
// librairie externe
namespace MangoPay;
class Address {
public $City;
}
class UserLegal {
public $HeadquartersAddress;
}
// code métier
$tmp = new \MangoPay\UserLegal();
$tmp->HeadquarterAddress = new \MangoPay\Address();
$tmp->HeadquarterAddress->City = 'Lyon';
function getAnArray(iterable $iterable) : array
{
$anArray = [];
foreach ($iterable as $item) {
$getAnArray[] = $item;
}
return $anArray;
}
/**
* @param array<int> $anArrayOfInt
*/
function doStuff(array $anArrayOfInt) {
foreach ($anArrayOfInt as $anInt) {
echo strtoupper($anInt);
}
}
use Doctrine\Common\Persistence\Collections\Collection;
/**
* @var array<int>|Collection<int> $var
*/
function doStuff($var) {
if ($var instanceof Collection) {
$var = $var->toArray();
}
// `$var` sera reconnu comme un tableau de int
}
interface Factory {
function make(): object;
}
class UserFactory implements Factory {
function make(): User;
}
class UserFactory implements Factory {
/**
* @return User
*/
function make(): object;
}
đź”— RFC Covariance / contravariance
Au début, j’ai ressenti un mélange de frustration et de grand intérêt. […] Stan me mets régulièrement face à mes manquements.Thomas
…un peu contraignant mais si on pèse le pour et le contre ça en vaut le détour.
L'investissement valait le coup, le code est plus propre…Sylvère
… chiant au début quand on connait pas […] un peu comme quand tu découvres les tests :
puis quelques mois après tu lances des deploy en sirotant un petit kir cassis…Dimitri