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)
是不是我们不能从外部更改其类型的受保护和私有属性?或者这也适用于公共财产吗?
您正在做的是用新值覆盖该属性,该值恰好是不同的类型。
类型转换不会影响原始变量或值。它创建一个类型转换类型的新值,如果您想保留该值,则需要分配该值。
您所要求的与对象属性的可见性无关,但要了解类型转换是一种不影响其操作数的操作。
这绝对没有任何作用$string:
$string = "123";
(int)$string;
Run Code Online (Sandbox Code Playgroud)
...并且类型转换的值丢失了,因为我们没有分配操作的结果
$class::$someInteger如果满足几个条件,我们可以使用以下内容覆盖 的值:
$class->someInteger = (string) 123;
Run Code Online (Sandbox Code Playgroud)
private或protected从类外部访问属性。你可以通过使用反射或奇怪的东西来欺骗这个,比如有一个返回对属性的引用的 getter ,但对于生产代码来说这两者都是非常糟糕的想法)。问题的“永久”部分尤其被误导,因为在 PHP 中通常变量没有类型。
您可以将任何类型的值分配给任何变量。当他们确实有类型(PHP 7.4 类型属性)时,没有改变定义类型的实用方法(同样,可能有一种使用反射的方法......但我不会去那里)。
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |