【问题标题】:Type hinting in function argument (magic __call) throw exception函数参数中的类型提示(魔术 __call)抛出异常
【发布时间】:2011-09-10 18:08:40
【问题描述】:

这个真让我头疼:

每当我尝试对传递给“字符串”类型的函数的 var 进行类型转换时,如下所示:

public function __call( string $name , array $args ) {
    ...
}

我收到以下错误:

可捕获的致命错误:传递给 [ClassName]::__call() 的参数 1 必须 是字符串的一个实例,字符串在 [php_file_name] 中给出 [行号]

嗯? “必须是字符串的实例,给定的字符串”?我没有传递一个字符串吗?我真的不明白这个错误信息。

现在我的解决方案一直是这样的:

public function __call( $name , array $args ) {
    if (!is_string($name)) { throw new Exception('$name must be a string');
}

但是,我的问题是,有没有办法在方法定义中而不是在方法本身中实际进行类型转换?

【问题讨论】:

  • 更正,这不是类型转换,而是类型提示
  • Aareon - 不,这里没有强制强制转换的方法。类型提示 expects 一个字符串,这就是它的工作原理。它不会转换它们。为什么你首先要传递一个非字符串?
  • 向我们展示您用于调用__call()的代码。特别是变量通过了。
  • @ajreal 啊,是的,这就是我的意思,类型提示,类型转换正在定义要“评估为”的变量,我知道 :) 对不起,我的错
  • @Aareon 在上面的例子中,这实际上不会发生(魔术方法),但它只是一个关于面对这个错误的一般问题,方法可能是:doAnything(string $name,数组 $value) 用于所有强烈目的

标签: php string casting


【解决方案1】:

在 php 中,您可以强制函数参数为数组或对象(类型提示)。因此,您的操作仅接受第一个参数的“字符串”对象,而不是字符串类型的变量。

类型提示只能是对象和数组(自 PHP 5.1 起)类型。不支持使用 int 和 string 进行传统类型提示。

更多信息在这里:http://www.php.net/manual/en/language.oop5.typehinting.php

并回答您的问题:通常情况下,您不能!

【讨论】:

  • 啊是的:“类型提示只能是对象和数组(自 PHP 5.1 起)类型。不支持使用 int 和字符串的传统类型提示。” (在那个文档页面上)。猜猜这就是为什么我总是在方法本身内进行检查。我猜 RTFM 在这里适用 :) 谢谢。
【解决方案2】:

PHP 不支持标量类型提示。仅适用于对象和数组。 PHP-cmets 的某个人编写了一种使用标量类型提示的方法。因为此错误属于catchable fatal error 类型。您可以定义自己的错误处理程序,让您在某些情况下继续处理此错误。

http://www.php.net/manual/de/language.oop5.typehinting.php#83442

但是,它很慢,我不建议使用它。

【讨论】:

  • 感谢 ontrack 的回答,并肯定 +1 用于在方法定义之外处理的替代方法。我将把它视为一种选择,并在未来的项目中衡量它的缓慢性和可行性。他们无法为原始数据类型添加类型提示真是太糟糕了。 (整数、字符串、字符等)
  • 另一方面,我想另一个选择是为每个标量创建一个类:class Integer { };类字符串 { };等并将它们用作对象来输入提示(以及某种检查和内部类型转换。(注意在第一个字母上使用大写,以免踩到保留字。类似的东西可能是一个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多