如何在 PHP 中永久类型转换类属性?

use*_*782 -3 php oop casting properties private-members

我一直在阅读PHP 手册的“可见性”部分,在第一条评论中,有人提到:

外部代码可以将 Item 属性转换为任何其他 PHP 类型(布尔值、整数、浮点数、字符串、数组和对象等)——另一个巨大的错误。

考虑这个例子:

class base {
    public $foo = 1;
}

$first = new base();

(string)$first->foo; //I thought just this expression would typecast
var_dump($first->foo); //but I found it still is int


$first->foo = (string)$first->foo;    
var_dump($first->foo); //ok so public props can be typecasted
Run Code Online (Sandbox Code Playgroud)

是不是我们不能从外部更改其类型的受保护和私有属性?或者这也适用于公共财产吗?

yiv*_*ivi 8

您正在做的是用新值覆盖该属性,该值恰好是不同的类型。

类型转换不会影响原始变量或值。它创建一个类型转换类型的新值,如果您想保留该值,则需要分配该值。

您所要求的与对象属性的可见性无关,但要了解类型转换是一种不影响其操作数的操作。

这绝对没有任何作用$string

$string = "123";
(int)$string;
Run Code Online (Sandbox Code Playgroud)

...并且类型转换的值丢失了,因为我们没有分配操作的结果

$class::$someInteger如果满足几个条件,我们可以使用以下内容覆盖 的值:

$class->someInteger = (string) 123;
Run Code Online (Sandbox Code Playgroud)
  1. 该财产是公共的。(你显然不能直接访问privateprotected从类外部访问属性。你可以通过使用反射或奇怪的东西来欺骗这个,比如有一个返回对属性的引用的 getter ,但对于生产代码来说这两者都是非常糟糕的想法)。
  2. 您没有使用 PHP 7.4类型化属性,并且已经为它声明了一个类型。

问题的“永久”部分尤其被误导,因为在 PHP 中通常变量没有类型

您可以将任何类型的值分配给任何变量。当他们确实有类型(PHP 7.4 类型属性)时,没有改变定义类型的实用方法(同样,可能有一种使用反射的方法......但我不会去那里)。