我目前的方式:
class A {
public function function_b($myint) {
if (!is_numeric($myint)) return false;
// code ...
}
}
我想放弃像这样的函数is_numeric():
public function function_b(Integer $myint) {
// code ...
}
它适用于这样的数组:
public function function_c(Array $arr) {
// only executes following code if $arr is an array / instance of Array!
}
注意:如果值不是数字(int),函数必须返回false!我不想投它。
你如何缩短我目前的代码?提前谢谢!
答案 0 :(得分:3)
你不能在PHP中强制使用函数原型中的严格类型,因为它不是严格类型的语言。 PHP是一种弱类型的语言,在许多情况下,试图反对谷物只会伤害你。此外,is_numeric 不保证您的值为int类型(,它的价值)。
您可以做的是分析您为什么首先认为这种方法是必要的,并决定如何最好地实现这一点而不会产生错误。
例如,采用以下方案,其中您的方法所期望的是数据库查询的ID。
class MyClass {
public function getUser($id) {
if (!is_int($id)) {
throw new Exception("Invalid argument supplied. Expecting (int), but argument is of type (" . gettype($id) . ").");
}
// Otherwise continue
$db = new PDO($dsn);
$stmt = $db->prepare("SELECT username FROM users WHERE user_id = ?");
$stmt->execute(array($id));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
}
$MyObject = new MyClass;
$result = $MyObject->getUser($_POST['id']);
/* The problem here is $_POST will always be of type string. */
这应该告诉你的是,在这里强制进行类型检查是没有意义的,因为只要你放弃它,PHP就会为你做正确的事情。
你需要问自己的问题不是“我如何强制严格打字?”,而是“为什么我需要强制严格打字?”
答案 1 :(得分:2)
你应该研究一下类型转换:
在访问值时使用(int)将其强制转换为整数。
答案 2 :(得分:2)
你可以对它进行强制转换:
public function function_b($myint) {
$myint = (int) $myint;
}
或者更好的是将公共设置器添加到class A
,每次设置值时都会为您执行此操作:
class A
{
public function setMyInt($myInt)
{
$this->myInt = (int) $myInt;
}
}
- 更新(根据评论) -
class A
{
public function doSomethingWithAnArray(array $array)
{
....
}
}
注意doSomethingWithAnArray
方法签名中的关键字数组,现在如果你没有将数组传递给这个函数,PHP将抛出致命错误并停止执行代码。这称为 typehinting ,也可以应用于对象。
答案 3 :(得分:1)
function needsInteger($int) {
if (((int) $int) != $int) return false;
// ...
}
这里的优点是你仍然可以接受松散类型的参数,但是对于强制转换值的非严格等式检查将产生可接受的结果。