Php 如果属性不退出,则默认为默认getter行为

Php 如果属性不退出,则默认为默认getter行为,php,oop,setter,getter,magic-methods,Php,Oop,Setter,Getter,Magic Methods,我目前需要扩展一个类以向其添加功能(我没有访问基类的权限来修改它),并且我遇到了一个ISSUE 基本上,我需要magic getter函数在被请求时返回一组私有变量,否则默认为默认行为。我需要这些属性是私有的,以便使用magicsetter函数自动同步一些数据 也就是说,下面是一些示例代码: class newClass extends baseClass { private $private1; private $private2; ... public f

我目前需要扩展一个类以向其添加功能(我没有访问基类的权限来修改它),并且我遇到了一个ISSUE

基本上,我需要magic getter函数在被请求时返回一组私有变量,否则默认为默认行为。我需要这些属性是私有的,以便使用magicsetter函数自动同步一些数据

也就是说,下面是一些示例代码:

class newClass extends baseClass {
    private $private1;
    private $private2;

    ...

    public function __get($name) {
        if($name == 'private1') return $this->private1;
        if($name == 'private2') return $this->private2;
        ... (and so on)
        // and here, it should default back to it's default behavior (throwing
        // an error on getting invalid/inaccessable property, etc.)
        // I cannot just use property_exists, because there may or may not be
        // private variables in the base class that should not be exposed.
    }
    public function __set($name,$val) {
        // I use this to do some automatic syncing when the two private variables
        // above are set. This needs to be triggered, hence the private variables
        // in the first place.
    }
}
我知道,我可以使用getProperty/setProperty函数,但我希望它尽可能保持直观,尽管有人认为执行此类操作是违反直觉的。这两处私人物业彼此有着密切的联系。当其中一个被设置时,逻辑上会影响其他的


到目前为止,这是我能想到的避免getter/setter函数并保持属性之间紧密结合的同步的唯一合乎逻辑的方法。如果你们能想出其他可行的解决方案,请随意提出建议:)

不要这样做,使用getter/setter。它们的工作量与您在这里所做的工作完全相同。

PHP不像其他语言那样内置属性,\uuuu get和\uu set确实是您在这里应该使用的。但是要完成的工作要多一些

您的问题似乎是最重要的属性存在。从课堂上确定属性的公开性是不容易的(内省除外)。但您至少可以使用
get_object_vars
从基类中过滤出私有变量:

 function __get($name) {
     static $r; if (!isset($r)) { $r = new ReflectionClass($this); }

     if (($p = $r->getProperty($name)) and $p->isPublic()) {
         return $this->$name;
     }
     elseif (method_exists($this, "get_$name")) {
         return $this->{"get_$name"}();
     }
     else trigger_error("inaccessible property ->$name", E_USER_NOTICE);
 }

要恢复默认行为,您最好手动输出一条错误消息。

您的问题是什么?尽可能保持直观魔术从来都不是直观的。顺便问一下,您所说的“默认行为”是指PHP默认行为还是您的父类?@Boris:也许最好的措辞不是直观的。也许我应该说“合乎逻辑”。当一对变量像在我的用例中那样紧密链接时,当一个变量被更新时,如果另一个变量没有被更新,它在逻辑上会使另一个变量无效。“默认行为”指的是,如果属性不可访问,则抛出其本机错误;如果属性是公共属性,则返回属性值,等等。因此PHP的默认行为。正如他在这里写的一样,是一个通过属性名索引的大型getter/setter。我明白你在这里说的,但我不明白的是:但是你至少可以使用get_object_vars从基类中过滤出私有变量。get_object_vars根据作用域获取,因此它将返回整个类中的所有非静态属性,再次公开不需要的私有变量。除非你的意思是get_object_vars会过滤父母的隐私,在这种情况下,这可能比目前我认为的更有用。我还没有在所有不同的范围中使用get_object_vars。是的,这不会有多大帮助。您必须使用
ReflectionClass
才能获得准确的结果。