在像Angular这样的一些框架中,您可以像这样将
注入服务和控制器App.controller('exampleController', function($scope, ajaxService){
ajaxService.getData().then(function(data) {
//do something with the data
});
});
这对Angular docs称为依赖注入 according
你也可以在Slim Framwork中做这样的事情,比如
$app->get('/example', function() use ($app, $db) {
$data = $db->getData();
//do something with the data
}
根据Slim docs,这称为 Currying 。
据我所知,这些是完全相同的事情?为什么他们用不同的名字打电话?
答案 0 :(得分:2)
这里有一些有趣的阅读:What is currying What is dependency injection
无论编程语言或框架如何,我们都可以说"依赖注入" (DI)是这样的 OOP类定义的授权(参见示例)和Currying是完全不同的,让我们说函数参数简化。
DI允许您保持课程简单和解耦。如果您熟悉Laravel,ServiceProvider就是一个很好的例子。简而言之,您的类具有一个属性,该属性将被设置为另一个类的实例(通常实现一个接口),以便您可以委派一些功能。典型的例子是:
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();
我刚刚编写了上面的代码(可能没有功能)来说明DI。使用接口确保方法" write()"将在任何实现LogInterface的类中实现。然后,当实例化对象时,您的类强制获取LogInterface对象。忘记"写()"有效,这不是你的事。
关于Currying,技术是不同的,你只需简化函数中的参数。当使用Slim Framework时,他们说"你可以使用$ app"来讨论你的路线。我已经很多地使用了Slim,我的理解是,好吧,rathaer而不是将几个变量传递给你的路由闭包只需要丰富你的$ app变量并传递1个单独的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();
});