kilka interesujących czytania tutaj: What is currying What is dependency injection
Bez względu na język programowania lub ramy, moglibyśmy powiedzieć „Dependency Injection” (DI) jest coś takiego jak delegacji w definicji OOP klasy (patrz przykład) i currying jest czymś zupełnie innym, powiedzmy uproszczeniem funkcji.
DI pozwala na łatwe prowadzenie zajęć i rozłączenie. Jeśli znasz Laravel, ServiceProvider to dobry przykład. W skrócie twoja klasa ma właściwość, która zostanie ustawiona na instancję innej klasy (zwykle implementującej interfejs), abyś mógł delegować niektóre funkcje. Typowy przykład:
interface LogInterface {
public function write();
}
class LogToFile implements LogInterface {
public function write()
{
//Do something
}
}
class LogToFileDB implements LogInterface {
public function write()
{
//Do something
}
}
class MyDIClass {
private $log;
public function __construct(LogInterface $log){
$this->log = $log;
}
public function writeLog(){
$this->log->write();
}
}
//You can do
$myobj = new MyDIClass(new LogToFile);
//or you can do
//$myobj = new MyDIClass(new LogToDB);
//this will work, no worries about "write()" you are delegating through DI
$myobj->writeLog();
Właśnie napisałem ten kod powyżej (prawdopodobnie nie działa), aby zilustrować DI. Za pomocą interfejsu zapewniamy, że metoda "write()" zostanie zaimplementowana w dowolnej klasie implementującej LogInterface. Następnie klasa wymusza uzyskanie obiektu LogInterface po utworzeniu obiektów. Zapomnij, jak działa "write()", to nie jest twoja firma.
W odniesieniu do curry, technika jest inna, po prostu upraszczamy params w funkcji. Podczas korzystania ze Slim Framework faceci mówią "możesz curry swoje trasy za pomocą $ app". Użyłem Slim dużo, a moje zrozumienie w ten sposób jest, ok, sprytniejsze niż przekazanie kilku zmiennych do zamkniętej trasy tylko wzbogacić zmienną $ app i przekazać 1 pojedynczy var: $ app
$app = new \Slim\Slim();
//Rather than
//$app->get('/foo', function() use ($app, $log, $store, ...) {
$app->get('/foo', function() use ($app) {
$app->render('foo.php'); // <-- SUCCESS
$app->log->write();
$app->db->store();
});