class A
{
private $x=100;
private $y=200;
}
$a=new A();
$x=(array) $a;
foreach($x as $key=>$val)
{
echo $x[$key];
}
我对private
的{{1}}变量有疑问。
当我将对象转换为数组时,类外的私有变量访问。它不应该在课外访问。但上面的示例我可以访问A类的私有变量。
结果如下
Class A
如何解决此问题?
答案 0 :(得分:4)
首先,我要开始,在对象中拥有私有成员的目的是确保对象本身可以拥有一些内部绝对控制的部分,并且可以依赖这些部分来处理某些行为。这不是为了确保成员的隐私,因为有些方法可以用所有语言访问它们(即使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;
}
答案 1 :(得分:0)
这是记录在案的行为:
http://www.php.net/manual/en/language.types.array.php
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,有一些值得注意的例外:整数属性是不可访问的;私有变量的类名前置于变量名;受保护的变量在变量名前面加上'*'。这些前置值在任一侧都有空字节。
答案 2 :(得分:0)
您没有访问那里的私人会员。你所拥有的只是一个包含对象状态的数组。封装被保留,您不允许在类块之外操作私有成员。
现在,您可以向后弯腰并获得可用于执行任何操作的对象状态,但这只是一个写得不好的客户端。
只有语言才能做到这一点,你应该可以自由地用任何语言编写好/坏代码。
答案 3 :(得分:0)
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