class A
{
private $x=100;
private $y=200;
}
$a=new A();
$x=(array) $a;
foreach($x as $key=>$val)
{
echo $x[$key];
}
我对Class A
的private
变量有问题。
当我将对象类型转换为数组时,类 A 私有变量访问类外。它不应该在类外部访问。但是上面的例子我可以访问A类的私有变量。
这是结果
100200
如何解决此问题?
首先,我将从对象中具有私有成员开始,目的是确保对象本身可以具有内部绝对控制的某些部分,并且可以依赖这些部分来实现某些行为。这不是为了确保成员的隐私,因为有办法以所有语言访问它们(即使PHP使它变得非常容易)。
您可以创建自己的函数,该函数仅在以下情况下公开公共属性:
function toAccessibleElementArray($object) {
if (!is_object($object)) { return []; } //or other sensible default?
$reflectionClass = new ReflectionClass(get_class($object));
$array = [];
foreach ($reflectionClass->getProperties() as $property) {
if ($property->isPublic()) {
$array[$property->getName()] = $property->getValue($object);
}
}
return $array;
}
您在那里无法访问私人成员。你所拥有的只是一个保存对象状态的数组。保留封装,不允许在类块之外进行私有成员操作。
现在,您可以向后弯腰并获得可用于执行任何操作的对象状态,但这只是一个编写不佳的客户端。
一种语言能做的只有这么多,你应该可以自由地用任何语言编写好/坏的代码。
这是一个记录在案的行为:
http://www.php.net/manual/en/language.types.array.php
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名称,但有一些值得注意的例外:整数属性不可访问;私有变量在变量名前面加上类名;受保护的变量在变量名称前面加上"*"。这些预置值的两端都有空字节。
PHP 7.4
<?php
class A
{
private $x=100;
private $y=200;
}
$a=new A();
$m = function(){
return [$this->x, $this->y];
};
[$x ,$y] = $m->call($a);
echo $x.','.$y;
您在那里无法访问私人成员
<?php
class A
{
private $x=100;
private $y=200;
private function __construct(){}
public function setX(){
$this->x =100;
}
public function setY(){
$this->y =200;
}
}
$a=new A();
$m = function(){
return [$this->x, $this->y];
};
[$x ,$y] = $m->call($a);
echo $x.','.$y;
<b>Fatal error</b>: Uncaught Error: Call to private A::__construct() from invalid context in