IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

PHP

PHP is considered to be a weak typed language. És a dir un llenguatge amb tipat fluix en comptes de llenguatges amb tipat fort (com Java)

A PHP els paràmetres d'una funció no tenen perquè indicar el tipus de paràmetre. De fet fins la versió 5.0 no es va afegir la opció de poder indicar el tipus del paràmetre. La traducció de Type Hinting al català seria "donar pistes sobre el tipus d'una variable".

Vegeu la diferència entre:

<?php
function enroll($student, $school) {
echo "Enrolling " . $student->name . " in " . $school->name;
}

i:

<?php
function enroll(Student $student, School $school) {
echo "Enrolling " . $student->name . " in " . $school->name;
}

Al segon exemple s'utilitza type-hinting. Utilitzant type Hinting el següent codi donaria un error:

<?php
$me = new Student("Amanda");
$medicare = new Program("Medicare");
$enroll = enroll($me, $medicare);

L'error:

Catchable fatal error: Argument 2 passed to enroll() must be an instance of School, instance of Program given, called in typehint.php on line 32 and defined in typehint.php on line 6

però no pas el primer codi.

Laravel

Laravel utilitzar el type-hinting al seu IoC Container (vegeu Laravel IoC Container) per tal de facilitar la injecció de dependències el que anomena Type-Hinting Controller Dependencies ([1]).

Vegem un exemple:

class FooBar {

    public function __construct(Baz $baz)
    {
        $this->baz = $baz;
    }

}

$fooBar = App::make('FooBar');

Laravel encara que no registrem especificament una classe al contenidor pot resoldre la classe automàticament injectant automàticament la classe Baz (el que es coneix com injecció de dependències). Això és així perquè amb el type-hinting que em fet al posar Baz al paràmetre baz del constructor Laravel pot utilitzar PHP Reflection per inspeccionar la classe i crear un nou objecte automàticament.

A la pràctica el més sovint és fer aquest tipus de relació entre classes als controladors de la següent forma:

class OrderController extends BaseController {

    public function __construct(OrderRepository $orders)
    {
        $this->orders = $orders;
    }

    public function getIndex()
    {
        $all = $this->orders->all();

        return View::make('orders', compact('all'));
    }

}

En aquest cas la classe OrderRepository serà injectada automàticament al controlador. Això és ideal per a realitzar testos unitaris Unit testing ja que podem crear un mock OrderRepository al fer els tests unitaris del controlador.

Laravel app:bind permet controlar el Type-hinting

Amb Laravel podem indicar al sistema com es tradueixen/apliquen els type-hints amb els mètodes de la classe app, especialment amb bind, podem fer quelcom similar a

App:bind('Bar', function() {
    return new Bar(new Baz)
}){
}

Encara que el més habitual (l'exemple és un exemple útil per entendre que fa bind però un exemple una mica juguey) és utilitzar app->bind per relacionar una interfície amb la seva implementació.

Vegeu també

Enllaços externs