PHP 프로젝트를 해킹으로 변환하는 중입니다. 그리고 저는 약간의 도로 블록을 발견했습니다. 내가하려는 일은 PHP에서 Hack으로 IoC 컨테이너를 다시 작성하는 것이며 해킹 유형 검사기 도구를 통과하는 데 모든 문제가 발생합니다.해킹에 IoC 컨테이너 작성하기
그래서 기본적으로 매핑 문자열을 등록 할 수있는 컨테이너가 있습니다. 아이디어는 클로저가 클래스를 인스턴스화하는 로직을 포함한다는 것입니다. 컨테이너는 또한 생성 한 인스턴스를 저장하고 강제로 새 인스턴스를 만들도록 허용합니다. Container::get()
또는 Container::getNew()
를 사용하는 경우 때
<?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;
}
}
이 클래스 자체는 반환 유형 mixed
이기 때문에 나는이 방법을 실행하려고 할 때, 그것은이 오류가 발생, 유형 검사를 통과 보이지만 : 여기 내 컨테이너 코드 이들에 의해 반환 된 객체에 :
당신은 멤버 X에 액세스하려고하지만,이 객체가 아닌, 그것은
지금 나는이 의미가 알고있는 혼합 값을하고, 수 원인은 분명히 비 객체를 허용하므로, is_object()
에 이러한 코드를 래핑해야합니다. 그러나 이렇게하면 형식 검사기에서 오류를 표시하지 않는 것처럼 보입니다. 해킹에서 객체가 무엇인지 확인하는 더 좋은 방법이 있습니까? 유형 검사기가이를 이해합니다.
또한이 IoC 컨테이너 클래스는 혼합 유형에 크게 의존합니다. 이는 저에게 다소 추한 것입니다. 런타임시 반환 값이 객체인지 확인하는 것은 이상적이지 않습니다. 내가 할 수있는 더 좋은 방법이 있니? IContainable 또는 뭔가 같은 인터페이스 변경 혼합 생각을 가지고 노는 시도하고 컨테이너에 저장하려는 모든 클래스가 있지만이 형식 검사기 IContainable 인터페이스 메서드를 포함하지 않았다는 불평했다. 컨테이너에서 반환 된 객체를 호출하려고했는데 (코드의 같은 지점에서 오류가 발생했지만 다른 이유가 있음). 아마도 나는이 접근법으로 성공에 가깝습니까?
도움 주셔서 감사합니다.
+1 멋진 대답에 내 솔루션을 볼 수 있습니다! 그리고 여기에 "hacklang"과 "hhvm"태그를 모니터링 해 주셔서 감사합니다. :). –
굉장한 답변! 제네릭을 보았지만 컨테이너가 현재 싱글 톤으로 작동하므로 작동하지 않습니다. DI로 코딩하고 클래스와 그 의존성이 어떻게 인스턴스화되는지에 대한 로직을 래핑하는 것이 이치에 맞는 것처럼 보이기 때문에이 레이어를 추가했습니다. PHP에서 어떻게 작동했는지에 관해서는 기술적으로 PHP 코드가 올바른 것을 알지 못했다고 생각합니다. 프로그래머가 별칭이 어떤 클래스 인스턴스화에 할당되었는지를 아는 것만으로도 문제가 발생했습니다. 실행 시간에 잡힐 것입니다. 그래서 여기에 전환 만이 아니라, 다시 생각해보십시오. – ndavison