- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 PHP 项目转换为 Hack 项目,但遇到了一些障碍。我想做的是将 IoC 容器从 PHP 重写为 Hack,但在让所有内容通过 Hack 类型检查器工具时遇到了一些麻烦。
所以基本上我拥有的是一个容器,可以让您将字符串注册到闭包映射。这个想法是闭包包含实例化类的逻辑。容器还存储它创建的实例,并且还允许您强制创建新实例。这是我的容器代码:
<?hh // strict
class Container {
private Map<string, mixed> $instances = Map {};
private Map<string, (function (Container): mixed)> $registered = Map {};
public function register(string $alias, (function (Container): mixed) $closure): void
{
$this->registered[$alias] = $closure;
}
public function get(string $alias): ?mixed
{
if (!$this->registered->contains($alias)) {
return null;
}
$instance = $this->instances->get($alias);
if ($instance !== null) {
return $instance;
}
$closure = $this->registered->get($alias);
if ($closure !== null) {
$this->instances->set($alias, $closure($this));
}
return $this->instances->get($alias);
}
public function getNew(string $alias): ?mixed
{
if (!$this->registered->contains($alias)) {
return null;
}
$closure = $this->registered->get($alias);
return ($closure !== null) ? $closure($this) : null;
}
}
这个类本身似乎通过了类型检查器,但是当使用 Container::get()
或 Container::getNew()
时,由于返回的是类型 mixed
,当我尝试对这些返回的对象执行方法时,它会抛出此错误:
You are trying to access the member x but this is not an object, it is a mixed value
现在我知道这是有道理的,因为混合显然允许非对象,所以我必须确保将此类代码包装在 is_object()
中,但是这样做似乎并不可行抑制类型检查器中的错误。有没有更好的方法来确认某个东西是 Hack 中的对象,并且类型检查器能够理解?
此外,这个 IoC 容器类严重依赖于混合类型,这对我来说有点难看。必须确保其返回值在运行时是对象也是不理想的。我有更好的方法可以做到这一点吗?我确实尝试过将混合更改为接口(interface)(如 IContainable 或其他东西)的想法,并且让我想要存储在容器中的任何类实现此功能,但类型检查器提示 IContainable 接口(interface)不包含该方法我试图调用从容器返回的对象(因此在代码中的同一点出现错误,但原因不同)。也许我用这种方法已经接近成功了?
感谢您的帮助。
最佳答案
Is there a better way to confirm something is an object in Hack, that the type checker will understand?
您可能想通过 instanceof
检查特定实例。例如:(警告,代码直接输入浏览器)
<?hh // strict
class C {
public function f(): void {}
}
function f(): mixed {
return new C();
}
function g(): void {
$c = f();
// $c->f() won't work out here, $c is mixed
if ($c instanceof C) {
$c->f(); // This works now
}
}
另请注意,您不需要 ?mixed
,这是多余的 - 只需使用 mixed
。 (因为 mixed 可以是任何东西,所以它也可以是 null。当你编写 ?mixed
时生成错误是我在某些时候要做的事情列表中的。:))
Also, this IoC container class relies heavily on the mixed type, which is a bit ugly to me.
你的直觉很好。在 Facebook,我们发现在大多数情况下,我们想要输入混合类型的内容,要么 1) 我们应该编写更具体的类型,要么 2) 代码的结构非常简单很糟糕,我们应该重新考虑如何构建它以更好地打字。
也许您应该使用更具体的类型。正如您所指出的,使用界面会有所帮助。如果事实证明您需要做的大多数事情实际上都是该接口(interface)的一部分,并且您只是偶尔需要做其他事情,那么您可以将其与上述 instanceof
功能结合起来。您可能还想看看using generics ,这可能有意义也可能没有意义,具体取决于您使用 Container
的具体方式。如果 Container 被实例化多次,每次实例化不同的特定子类或接口(interface),那么泛型可能正是您想要的。如果它是单例,那么也许不是。 (此外,虽然您没有在此处显示它,但如果 Container
以任何方式与其保存的类进行交互,您可能需要 constraint on the generic 。)
但我怀疑您遇到这个问题是由于结构性问题。当我遇到这个问题时,我会想到以下一些事情:为什么首先需要围绕实例化类进行这一抽象层——它提供什么功能,以及您能否使该功能同构(即,可打字) )并与异构类实例化问题分开?暂时忽略正式类型(即,如果您是用普通 PHP 编写的),使用 Container
的类如何知道它得到了正确的东西?必须对进出的内容有一定的了解,无论调用代码中的内容是非正式的还是其他方式,否则这首先就行不通!考虑一下这些信息是在哪里以及如何编码的,然后看看是否可以找到一种方法将其明确化。
希望这有帮助!如果我可以澄清任何事情,请在评论中告诉我。当然,请随意继续问这样的问题,许多 FB Hack 工程师以及知识渊博的社区成员都密切关注“hacklang”标签:)(我们真的很高兴人们正在尝试 Hack BTW!希望你是享受它。)
关于hacklang - 在 Hack 中编写 IoC 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580272/
我希望在我的页面上使用一些吸引眼球的实验性 CSS,例如 border-radius(圆 Angular )和渐变。不幸的是,Internet Explorer 还不支持任何这些。至少 border-
我不喜欢微软的字体渲染。 我为客户创建了一个站点,我的调试列表中最后一个未选中的框是最大的。 (顺便说一句,它还没有“上线”,所以请忽略任何其他错误 - http://baked-beans.tv/b
一般情况下,当我们想在同一页面显示某个网页的内容时,我们会使用ajax请求。如果说,我使用 AJAX 请求不同域中的网页,由于跨端脚本错误,这是不允许的。但是为什么允许通过服务器端页面访问。例如我们可
在我的 css 代码中,我有一些 hack,我想影响 IE6/7 #topmenu li a.activa, #topmenu li a.activa:hover{ *background:
在过去的两个月里,我一直在试图“愚弄”safari,让它认为它正在查看服务器上的一个文件,这实际上是来自摄像机的实时视频流,根据请求使用 Gstreamer 编码和混合成一种格式这是浏览器支持的。由于
怎么说呢,相信很多考过竞赛的同学都会在平时的练习/考试中遭遇过100分但没有AC的情况,结果一看评测结果:subtask的数据点没过! 这时候就是遇到hack数据了,如果被这类数据卡住,说明你
Avast 不时出现在我的一个网站上。有点奇怪,因为我对安全性非常严格,但我检查了 index.php 文件和所有相关的包含和脚本。在我删除的“header.php”文件中发现了一些奇怪的 PHP 代
所以我使用一个程序,我在 lua 中编写 mods,lua 处于沙箱状态,这意味着大多数功能都被阻止,如 IO 和 OS,我什至不能使用 REQUIRE 添加库。我需要一个功能来解压缩我的一个 mod
在 Wiki page for Sudoku solutions ,一种解决方案声称使用“Dot Hack”。链接的 Github 页面不再可用,我在别处找不到任何关于它的信息。 这是关于什么的?它有
嗨, friend 们,是否有可能获得像这样 100% 宽度和高度的双色背景 这是示例图像: Sample Image http://www.mediaserveit.com/demo/vivek/r
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一个网站使用来自谷歌字体的自定义字体。在我的网站上它是正常对齐的,但在我的 android 上,源不对齐。通过各种移动技巧进行研究,我想知道它们是否真的有效,因为经过一项一项的测试,它并没有奏效。
我正在使用... background:url(menu-bg.png) repeat-x, url(spot.gif) repeat; background:url(spot.gif)\0/; 在
我尝试隐藏/显示 div“游戏类型”,但如果输入复选框在列表项中,则以下代码不会运行,我不明白为什么 是否可以在不使用 js 的情况下使用“no-game”输入禁用“pc”和“xbox”输入? inp
简单的问题:我正在 HTML5/Socket.io 中构建一个多人游戏,并使用 Phaser 作为游戏框架。我现在已经进入了为黑客行为添加预防措施的阶段了。 基本上我的问题很简单:潜在的黑客是否可以实
是否有任何方法(hack)插入 Python 函数(def)通过引用返回结果,即使对于不可变类型也是如此? 提案申请(swap as subroutine): def swap(a, b): ....
谁能帮我解决这个问题。我是 css 样式的新手。我有一个 css 文件,其中包含我要构建的 asp.net 网站的所有样式。然而,它在安装了 IE 7 的服务器上运行良好,当我尝试使用 chrome、
以下制作可变大小结构的方法有什么问题? struct tode{ int g; int *p; }; struct tode *lp = malloc(sizeof
我已经停止为不同的浏览器使用 CSS hack,而是支持“条件注释将类添加到 html 标记”方法。 这让我想到了我的问题。我如何编写这个 ie8 hack 没有 hack? .grab-cursor
这样的闭包实现有什么问题吗(从python hack中偷来的)? void function(int value) { struct closure { closure(int
我是一名优秀的程序员,十分优秀!