Typo3 extbase @param int 不工作
Typo3 extbase @param int not working
我的 ProductsRepository 中有这个函数:
/**
* @param int $ProductId
* @return \Foo\Bar\Domain\Model\Products
*/
public function getProductById(int $ProductId) {
$query = $this->createQuery();
$query->matching(
$query->equals('productId', $ProductId)
);
$query->setLimit(1);
return $query->execute()->getFirst();
}
我这样称呼它:
$product = $this->productsRepository->getProductById($ProductId);
在带有 PHP 5.6.3 的 Typo3 6.2.6 中,这工作正常,但在带有 PHP 5.6.12 的 Typo3 6.2.12 中,它在我的 error.log 中说了以下内容:
[Wed Sep 09 15:59:32.922153 2015] [:error] [pid 26601] [client 192.168.113.4:58686] PHP Catchable fatal error: Argument 1 passed to Foo\Bar\Domain\Repository\ProductsRepository::getProductById() must be an instance of Foo\Bar\Domain\Repository\int, integer given
你知道为什么我的存储库想要 Foo\Bar\Domain\Repository\int
而不是 int
吗?
尝试 @param \integer
而不是删除参数中的类型提示。但是,类型 \integer
是扩展构建器在模型 类.
中默认生成的类型
我建议只使用 PHPDoc 注释而不是 PHPs 类型提示。 Extbase 会在需要的地方验证类型,这样您就可以减少麻烦。
正如 Jost 和 Viktor 在评论中提到的,这不是 TYPO3 错误消息,而是 PHP 错误消息。 PHP 不支持 int
、bool
等原始类型的类型提示(它会 as of PHP 7)。
这段代码实际做了什么:通过使用 int
作为类型提示,PHP 假定您需要 a 的一个实例class int
作为参数(请注意,此行为将在 PHP 7 中更改)。因为没有指定命名空间,PHP 假定此 int
class 在您当前的命名空间 Foo\Bar\Domain\Repository
中。这意味着当您使用 $this->productRepository->getProductById(5)
调用此方法时,您将传递一个整数值 (5
) 作为参数,其中 PHP 需要一个实例(可能不存在)class Foo\Bar\Domain\Repository\int
。然后这会触发 "Argument 1 passed to ... must be an instance of ..., integer given" 错误。
总结一下: 使用标量类型提示在 PHP 5 中从未起作用,也永远不会起作用(它会在 PHP 7 中起作用)。如果它确实在某些时候看起来有效,很可能它并没有真正起作用,但由于 PHP 中的错误可能已在版本之间修复,因此没有触发错误。
回到TYPO3:在特定的地方,你可以在注释中使用标量类型提示。但是,这仅在请求参数映射到方法参数的地方才有可能(最值得注意的是控制器操作,您可以在其中使用 @param
注释和域实体属性,您可以在其中使用 @var
注释。这虽然是框架功能,但不适用于 $this->productRepository->getProductById(5)
.
等常规方法调用
我的 ProductsRepository 中有这个函数:
/**
* @param int $ProductId
* @return \Foo\Bar\Domain\Model\Products
*/
public function getProductById(int $ProductId) {
$query = $this->createQuery();
$query->matching(
$query->equals('productId', $ProductId)
);
$query->setLimit(1);
return $query->execute()->getFirst();
}
我这样称呼它:
$product = $this->productsRepository->getProductById($ProductId);
在带有 PHP 5.6.3 的 Typo3 6.2.6 中,这工作正常,但在带有 PHP 5.6.12 的 Typo3 6.2.12 中,它在我的 error.log 中说了以下内容:
[Wed Sep 09 15:59:32.922153 2015] [:error] [pid 26601] [client 192.168.113.4:58686] PHP Catchable fatal error: Argument 1 passed to Foo\Bar\Domain\Repository\ProductsRepository::getProductById() must be an instance of Foo\Bar\Domain\Repository\int, integer given
你知道为什么我的存储库想要 Foo\Bar\Domain\Repository\int
而不是 int
吗?
尝试 @param \integer
而不是删除参数中的类型提示。但是,类型 \integer
是扩展构建器在模型 类.
我建议只使用 PHPDoc 注释而不是 PHPs 类型提示。 Extbase 会在需要的地方验证类型,这样您就可以减少麻烦。
正如 Jost 和 Viktor 在评论中提到的,这不是 TYPO3 错误消息,而是 PHP 错误消息。 PHP 不支持 int
、bool
等原始类型的类型提示(它会 as of PHP 7)。
这段代码实际做了什么:通过使用 int
作为类型提示,PHP 假定您需要 a 的一个实例class int
作为参数(请注意,此行为将在 PHP 7 中更改)。因为没有指定命名空间,PHP 假定此 int
class 在您当前的命名空间 Foo\Bar\Domain\Repository
中。这意味着当您使用 $this->productRepository->getProductById(5)
调用此方法时,您将传递一个整数值 (5
) 作为参数,其中 PHP 需要一个实例(可能不存在)class Foo\Bar\Domain\Repository\int
。然后这会触发 "Argument 1 passed to ... must be an instance of ..., integer given" 错误。
总结一下: 使用标量类型提示在 PHP 5 中从未起作用,也永远不会起作用(它会在 PHP 7 中起作用)。如果它确实在某些时候看起来有效,很可能它并没有真正起作用,但由于 PHP 中的错误可能已在版本之间修复,因此没有触发错误。
回到TYPO3:在特定的地方,你可以在注释中使用标量类型提示。但是,这仅在请求参数映射到方法参数的地方才有可能(最值得注意的是控制器操作,您可以在其中使用 @param
注释和域实体属性,您可以在其中使用 @var
注释。这虽然是框架功能,但不适用于 $this->productRepository->getProductById(5)
.