繁体   English   中英

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类的私有变量。

这是结果

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM