无需在 php 中输入强制类型转换。
Edit: 由于这个话题似乎引起了一些混乱,我想我应该详细说明一下。
在 Java 等语言中,有两种东西可以携带类型。编译器有一个关于类型的概念,而运行时有另一个关于类型的概念。编译器类型与变量绑定,而运行时引擎跟踪值的类型(分配给变量)。变量类型在编译时已知,而值类型仅在运行时已知。
如果一段输入代码违反了编译器的类型系统,编译器将呕吐并停止编译。换句话说,不可能编译出一段违反静态类型系统的代码。这可以捕获特定类别的错误。例如,采用以下(简化的)Java 代码:
class Alpha {}
class Beta extends Alpha {
public void sayHello() {
System.out.println("Hello");
}
}
如果我们现在这样做:
Alpha a = new Beta();
我们会没事的,因为Beta
是一个子类Alpha
,因此变量的有效值a
类型的Alpha
。但是,如果我们继续这样做:
a.sayHello();
编译器会给出错误,因为该方法sayHello
不是有效的方法Alpha
- 不管我们知道a
实际上是一个Beta
.
输入类型转换:
((Beta) a).sayHello();
这里我们告诉编译器变量a
在这种情况下,应该被视为Beta
。这称为类型转换。这个漏洞非常有用,因为它允许语言中的多态性,但显然它也是各种违反类型系统的后门。为了保持某种类型安全,因此有一些限制;您只能转换为相关的类型。例如。在层次结构中向上或向下。换句话说,你将无法转换到完全不相关的类Charlie
.
值得注意的是,所有这些都发生在编译器中 - 也就是说,它发生在代码运行之前。 Java 仍然可能出现运行时类型错误。例如,如果您这样做:
class Alpha {}
class Beta extends Alpha {
public void sayHello() {
System.out.println("Hello");
}
}
class Charlie extends Alpha {}
Alpha a = new Charlie();
((Beta) a).sayHello();
上面的代码对于编译器来说是有效的,但是在运行时,你会得到一个异常,因为来自Beta
to Charlie
不兼容。
与此同时,回到 PHP 农场。
以下内容对 PHP 编译器有效 - 它会很乐意将其转换为可执行字节代码,但您会收到运行时错误:
class Alpha {}
class Beta extends Alpha {
function sayHello() {
print "Hello";
}
}
$a = new Alpha();
$a->sayHello();
这是因为 PHP 变量没有类型。编译器不知道什么运行时类型对变量有效,因此它不会尝试强制执行它。您也不必像 Java 中那样显式指定类型。是的,有类型提示,但这些只是运行时合约。以下内容仍然有效:
// reuse the classes from above
function tellToSayHello(Alpha $a) {
$a->sayHello();
}
tellToSayHello(new Beta());
尽管 PHP变量没有类型,values仍然如此。 PHP 的一个特别有趣的方面是可以更改值的类型。例如:
// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
settype($foo, "integer");
echo gettype($foo); // Yields "integer"
此功能有时与类型转换相混淆,但这是用词不当。类型仍然是值的属性,并且类型更改发生在运行时 - 而不是在编译时。
PHP 中更改类型的能力也相当有限。只能在简单类型之间更改类型,而不能在对象之间更改类型。因此,不可能将类型从一个类更改为另一类。您可以创建一个新对象并复制状态,但无法更改类型。 PHP 在这方面有点局外人;其他类似的语言将类视为比 PHP 更加动态的概念。
PHP 的另一个类似功能是您可以将值克隆为新类型,如下所示:
// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
$bar = (integer) $foo;
echo gettype($bar); // Yields "integer"
从语法上讲,这看起来很像静态类型语言中类型转换的编写方式。因此,它也经常与类型转换混淆,尽管它仍然是运行时类型转换。
总结一下:类型转换是一种更改变量类型的操作(not价值)。由于 PHP 中的变量没有类型,因此这不仅是不可能做到的,而且一开始就提出这个问题是无意义的。