【问题标题】:How to Access the private member of class? [duplicate]如何访问班级的私人成员? [复制]
【发布时间】:2015-07-23 00:44:59
【问题描述】:
xPostModel Object
(
[script:Model:private] => abc
)

我想把 abc 改成 efg 怎么办?有什么办法吗?

【问题讨论】:

  • 哪里需要改?您只能在类本身中直接更改它,因此如果您需要在类之外更改它,则需要在类中为其创建一个 setter 方法。
  • 其实我没有访问权限..我只能做对象..
  • 您也可以为此使用反射,但在正常情况下这不应该被视为一种好的做法。你可以在这里看到一个例子:stackoverflow.com/a/6448613/1362634
  • 对我没有帮助
  • 为什么它对您的案件没有帮助?似乎您有一个私有类属性 $script ,它是从父类 Model 继承的。我正在尝试使用在这种情况下可以使用的反射来做一个示例。我自己之前没有使用过反射,所以我不能 100% 确定在这种继承的私有财产案例中是否可行。

标签: php oop


【解决方案1】:

如果您无法更改类定义并且类属性没有公共 setter 方法,并且您确实需要能够在类外直接编辑属性,那么您唯一的选择可能是使用@987654321 @ 方法,请参见此处的示例:https://stackoverflow.com/a/6448613/1362634

下面是一个示例,可以在您的情况下在 $obj 中设置私有属性 $script,类型为 xPostModel(其中属性继承自父类 Model):

$obj = new xPostModel();
$refProperty = new ReflectionProperty('Model', 'script');
$refProperty->setAccessible(true);
$refProperty->setValue($obj, 'def');

这是一个完整的代码示例,其中包含用于模拟问题情况的模型类定义。

<?php
error_reporting(-1);
ini_set('display_errors', 1);

class Model {
    private $script = 'abc';
}

class xPostModel extends Model {}

$obj = new xPostModel();

print_r($obj); // Check original value of inherited private property

$refProperty = new ReflectionProperty('Model', 'script');
$refProperty->setAccessible(true);
$refProperty->setValue($obj, 'def');

print_r($obj); // Check that property has been changed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2016-10-26
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多