您的问题是基于对术语 typecasting 含义的误解。PHP Manual's page on type casting 和整个手册通常是不充分的,并且不是用于学习php语言。另外,它假设您了解其他编程语言,例如 C。
类型转换不定义为变量的数据类型转换;它是 表达式 的数据类型转换——一般来说,在大多数编程语言中都是如此。 Wikipedea 定义如下:
在计算机科学中,类型转换、类型转换、类型强制和类型杂耍是将表达式从一种数据类型更改为另一种数据类型的不同方法。
官方手册使用了三个术语,分别是type juggling、type conversion和type cast。从第一段就可以猜到,类型杂耍和类型转换是一回事。在第一段中,他们说:
请注意,这不会改变操作数本身的类型;唯一的变化是操作数的求值方式...
应该清楚type juggling绝对不会改变变量的类型。从 php 手册中可以看出,type juggling 和 type cast 是两个不同的概念。问题是,由于 PHP 手册从未定义这些术语,我们如何确定这两个术语是否相同以及它们的实际含义。在 Type Casting 文章中,手册说:
PHP 中的类型转换与 C:... 中的工作方式非常相似
所以,答案是,我们可以放心地假设 C 语言中的类型转换 的定义适用于 PHP 语言。在 C 语言中,类型转换 的定义与 Wikipedia 定义相同,即仅转换表达式的数据类型。以下摘录摘自本书The C Programming Language by K&R, 2nd edition,第2.7节,第45页:
在构造(type-name) expression中,表达式被转换为命名类型... ...强制转换的确切含义就像将表达式分配给特定类型的变量... ...我们可以使用sqrt((double) n)... ...请注意, cast 会产生正确类型的 n 值,n 本身不会改变。
这总结了 type cast 在 php 中的工作方式与 type juggling 相同的事实,因为所作用的变量(操作数)的数据类型没有改变。您可以使用函数settype() 来转换变量的数据类型。
正如第一段所指出的,php manual's page on types 在最后一段中给出了以下技术上的错误评论:
要强制将变量转换为特定类型,可以cast变量或对其使用 settype() 函数。
现在,您知道 php 中的 type cast 的实际含义以及为什么会有这种误解,最好将您的问题改写如下:
改写问题: 如何在 PHP 中永久转换类属性的数据类型。
很明显,settype($myObj->myPubProp, required-type) 可以轻松地将公共属性转换为不同的类型。有趣的是,与user yivi's original answer 中的建议相反,privated 和protected 属性可以被评估并且可以从类外部转换它们的类型[1][@ 987654328@]。
方法一:使用引用:
class myClass {
private $prop = 786; //Could be protected too.
public function &assess_priv(){
return $this->prop;
}
public function display_prop() {
echo var_dump($this->prop);
}
}
$obj = new myClass;
$newObjProp = &$obj->assess_priv();
settype($newObjProp, "string");
$obj->display_prop(); //converted the data type of private property of a class
方法二:使用 PHP 属性重载
error_reporting(E_ALL);
class myClass {
private $prop = 786; //Could be protected too.
public function __set($name, $value)
{
$this->$name = $value;
}
public function __get($name)
{
return $this->$name;
}
}
$obj = new myClass;
var_dump($obj->prop);
$obj->prop = (string)$obj->prop; //Interestingly, settype($obj->prop, "string"); can't be used
echo "</br>";
var_dump($obj->prop); //converted the data type of private property of a class