php中的对象类型转换,php – 用户定义对象的类型转换

没有必要在php中键入cast。

编辑:因为这个话题似乎引起一些混乱,我以为我会阐述一点。

在Java等语言中,有两种可能携带类型的东西。编译器有一个关于类型的概念,运行时有另一个关于类型的想法。编译器类型绑定到变量,而运行时引擎跟踪值的类型(分配给变量)。变量类型在编译时是已知的,而值类型仅在运行时知道。

如果一段输入代码违反编译器类型系统,编译器将barf并停止编译。换句话说,不可能编译一段违反静态类型系统的代码。这捕获了一定类的错误。例如,获取以下(简化)Java代码:

class Alpha {}

class Beta extends Alpha {

public void sayHello() {

System.out.println("Hello");

}

}

如果我们现在这样做:

Alpha a = new Beta();

我们会很好,因为Beta是Alpha的子类,因此是Alpha类型的变量a的有效值。但是,如果我们继续做:

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到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变量没有类型,值仍然。 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"

在语法上,这看起来很像一个类型转换是如何用静态类型语言编写的。因此,它也经常与类型转换混淆,即使它仍然是一个运行时类型转换。

总结:类型转换是一种改变变量类型(不是值)的操作。由于变量在PHP中没有类型,它不仅不可能做到,而且是一个毫无意义的事情,首先要问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值