PHP 类私有属性访问类外


php class private property access outside class

class A
{
   private $x=100;
   private $y=200;
}
$a=new A();
$x=(array) $a;
foreach($x as $key=>$val)
{
  echo $x[$key];
}

我对Class Aprivate变量有问题。

当我将对象类型转换为数组时,类 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