我是 OO 的新手,但正在四处阅读并尝试学习以“正确”的方式做事。我一直在阅读依赖注入(inject),并且可以理解为什么它是一件好事,但是我对语法并不完全清楚。
例如看这个Basic PHP Object Oriented Instantiation and Dependency Injection关于 SO 的问题我复制了完全相同的代码(按照答案建议进行更改)然后打印出方法返回的内容:
$author = new Author('Mickey', 'Mouse');
print $author->getFirstName();
$question = new Question('what day is it?', $author);
print $question->getQuestion();
但是我不清楚类名在其中扮演的角色:
public function __construct($question, Author $author)
{
$this->author = $author;
$this->question = $question;
}
如果我将它从我的代码中删除,则不会出现任何问题。它只是一个人类可读的东西,以便其他人可以明确地看到存在依赖关系,还是它在实际使代码工作中发挥作用?
感谢您的帮助!
最佳答案
这是一个type hint ,这是 PHP 5 的一个特性。如果您键入 hint 一个参数(通过在其前面加上类名),您将强制该参数成为该类型的对象。 (它不必是那个确切类的实例,它也可以是子类的实例)
类型甚至不一定是类:您还可以使用 interface 进行类型提示。
请参阅 PHP 文档中的这个(略有改动的)示例:
<?php
class MyClass
{
/**
* $fooBar must be an instance of FooBar (or a subclass of FooBar).
*/
public function foo(FooBar $fooBar)
{
// because we know that we have an instance of FooBar, we can use it's method barFoo()
$fooBar->barFoo();
}
}
class FooBar
{
public function barFoo()
{
// do something
}
}
因为这使您能够强制参数的类型,所以您可以确定它具有特定的接口(interface)。对于上面的示例,您可以安全地使用 barFoo() 方法,因为 $fooBar 是 FooBar 的实例(因此具有barFoo() 定义)。
您还可以使用类型提示强制参数为数组:
public function foo(array $bars)
{
foreach ($bars as $bar) {
// do something
}
}
正如 Wilt 在评论中指出的那样,PHP 7 还引入了标量 type declarations ,这意味着您还可以强制执行标量类型(例如 string、bool、int 等)
请注意,boolean 和 integer 将不起作用,您必须使用短版本(bool 和 int).
// not possible:
public function bar(string $myText, int $someNumber)
{
}
关于PHP 依赖注入(inject) - 在构造函数中包含类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23680157/
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。