Hack
@Quidi90@davidmogar @elwinlhq
HACK 101
De PHP a Hack en 20 minutos
2014
+ PHP + Java + C#
+ PHP
<?hh
echo 'Lets's Hack';
<?php
echo 'Yup, still valid';
La mayoría de
los archivos PHP
son válidos en Hack
TODO PUEDE FALLAR
Slide by Aaron Weyenberg
1
Estático y dinámico
<?php
function sumar_uno($n) {
return $n + 1;
}
function test() {
$mi_cadena = 'hola';
sumar_uno($mi_cadena);
}
<?hh
function sumar_uno(int $n): int {
return $n + 1;
}
function test(): void {
$mi_cadena = 'hola';
sumar_uno($mi_cadena);
}
2
Modos
<?hh // strict <?hh // partial <?hh // decl
<?hh
function unsafe_foo(int $x, int $y): int {
if ($x > $y) {
// UNSAFE
return "Nadie va a comprobar mi tipo";
}
return 34; // NO está cubierto por UNSAFE
}
3
Constructores
<?hh
class Punto {
public function __construct(
private float $x,
private float $y
) { }
}
<?php
class Punto {
private $x;
private $y;
function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
4
Colecciones
<?hh
function test(): int {
$vector = Vector {1, 2, 3 };
$sum = 0;
foreach ($vector as $val) {
$sum += $val;
}
return $sum;
}
<?hh
function test() {
$mapa = Map{"A" => 1, "B" => 2, "C" => 3 };
$mapa["D"] = 4;
$mapa["E"] = 5;
$map->remove("B");
foreach ($mapa as $clave => $valor) {
echo $clave . ": " . $valor;
}
}
Set
Pair
ImmVector
ImmMap
ImmSet
5
Expresiones Lambda
<?hh
$imprimir_mapa = ($nombre, $mapa) ==> {
echo "El mapa $nombre tiene:n";
foreach ($mapa as $clave => $valor) {
echo " $clave => $valorn";
}
};
$imprimir_mapa(
"Mi Mapa",
Map {'a' => 'b', 'c' => 'd'},
);
6
Nullable
<?hh
function consultar(): ?DBData {
$consulta = mysql_query('SELECT …');
if ($consulta === false || mysql_num_rows($consulta) == 0) {
return null;
}
return new DBData(mysql_fetch_array($consulta));
}
function test() {
$datos = consultar();
}
7
Generics
<?hh
class Almacen<T> {
public function __construct(
private T $dato
) {}
public function get(): T {
return $this->dato;
}
public function set(T $nuevo_dato): void {
$this->dato = $nuevo_dato;
}
}
function test(): Almacen<int> {
$dato = 'Hola mundo!';
$almacen = new Almacen($dato);
return $almacen;
}
8
Enumeraciones
<?hh
enum DiaDeLaSemana: int {
Lunes = 0;
Martes = 1;
Miercoles= 2;
Jueves = 3;
Viernes = 4;
Sabado = 5;
Domingo = 6;
}
function foo(): DiaDeLaSemana {
return DiaDeLaSemana::Martes;
}
9
Shapes
<?hh
type Punto = shape('x' => int, 'y' => int);
function productoEscalar(Punto $inicio, Punto $fin): int {
var_dump($inicio);
var_dump($fin);
return $inicio['x'] * $fin['x'] + $inicio['y'] * $fin['y'];
}
function test(): void {
echo productoEscalar(shape('x' => 3, 'y' => 3), shape('x' => 4, 'y' => 4));
}
10
Tuplas
function foo(): (string, int) {
$tupla = tuple("Hola", 3);
$tupla[1] = 4;
return $tupla;
}
11
Continuaciones
<?hh
function producirInfinitosEnteros(): Continuation<int> {
$i = 0;
while (true) {
yield $i++;
}
}
$generador = producirInfinitosEnteros();
foreach ($generador as $valor) {
echo "$valorn";
}
12
Traits
<?hh
interface Bar {
public function primero(Vector<int> $vector): int;
public function get(): int;
}
trait Foo implements Bar {
private int $valor = 5;
private function getValor(): int {
return $this->valor;
}
public function get(): int {
return $this->getValor();
}
public function primero(Vector<int> $vector): int {
if (count($vector) > 0) {
return $vector[0];
}
return -1;
}
}
class FooBar implements Bar {
use Foo;
private Vector<int> $vector;
public function __construct() {
$this->vector = Vector {};
$this->vector[] = $this->get();
}
public function segundo(): int {
return $this->primero($this->v);
}
}
function test() {
$foobar = new FooBar();
var_dump($foobar->segundo()); // 5
}
13
Async
<?hh
class Foo {}
class Bar {
public function getFoo(): Foo { return new Foo(); }
}
async function generar_foo(int $valor): Awaitable<?Foo> {
if ($valor === 0) { return null; }
$bar = await gen_bar($valor);
if ($bar !== null) {
return $bar->getFoo();
}
return null;
}
async function generar_bar(int $valor): Awaitable<?Bar> {
if ($valor === 0) { return null; }
return new Bar();
}
generar_foo(4);
14
Características--
● Construcciones poco frecuentes (goto, if:...endif)
● AND, OR, XOR
● Referencias
function foo(&$x)
● Uso del simbolo @ para silenciar errores
● break N y continue N
● Globales (global $x;)
● Variables compuestas por variables
$a = "hola"; $$a = "mundo"; echo "$a + $hola";
● Mezcla de etiquetas HTML y de código -> XHP
¿Y ahora?
Hack
@Quidi90@davidmogar @elwinlhq

Hack (Lenguaje de Programacion)