Php 使用->;对受保护的属性调用_get();操作人员

Php 使用->;对受保护的属性调用_get();操作人员,php,magic-methods,lazy-loading,Php,Magic Methods,Lazy Loading,我的团队正在使用懒散加载技术从数据库中加载子对象。为此,我们使用magic _get()方法并进行数据库调用。我们的所有属性都受到保护,因此从对象外部调用uu get方法,但我们的问题是,如果不使用$this->\uu get($name),就无法从对象内部调用它 所以我的问题是:即使在对象内部,也可以强制使用普通的链式操作符调用_get() 如果要链接对象访问,当前必须执行以下操作: $this->__get('subObject')->__get('subObject')->

我的团队正在使用懒散加载技术从数据库中加载子对象。为此,我们使用magic _get()方法并进行数据库调用。我们的所有属性都受到保护,因此从对象外部调用uu get方法,但我们的问题是,如果不使用
$this->\uu get($name),就无法从对象内部调用它

所以我的问题是:即使在对象内部,也可以强制使用普通的链式操作符调用_get()

如果要链接对象访问,当前必须执行以下操作:

$this->__get('subObject')->__get('subObject')->__get('subObject') 
是否可以编写以下代码,但仍让它调用uu get()

谢谢, 约旦

约旦

PHP不会调用
\uu get()
方法,除非该属性不存在或由于可见性而无法访问。当该属性从调用范围中隐藏时,将调用_get()方法,因为该属性不可访问。当属性被引用并且可用于调用范围时,\uuu get()将永远不会激发。(这并不意味着为现有/可访问的财产开火。)

要解决此问题,必须重命名内部属性。可以使用名称、下划线作为前缀,也可以使用特殊名称将它们存储在公共数组参数中。下面的内容有些做作,但应该说明如何处理这种情况

class MyObject {
   protected $lazyloads = array();

   protected function lazyload($relation) {
     // ...
   }

   public function __get($key) {
     if (isset($this->lazyloads[$key]) {
       return $this->lazyloads[$key];
     } else {
       return $this->lazyload($key);
     }
   }
}
见:

约旦

PHP不会调用
\uu get()
方法,除非该属性不存在或由于可见性而无法访问。当该属性从调用范围中隐藏时,将调用_get()方法,因为该属性不可访问。当属性被引用并且可用于调用范围时,\uuu get()将永远不会激发。(这并不意味着为现有/可访问的财产开火。)

要解决此问题,必须重命名内部属性。可以使用名称、下划线作为前缀,也可以使用特殊名称将它们存储在公共数组参数中。下面的内容有些做作,但应该说明如何处理这种情况

class MyObject {
   protected $lazyloads = array();

   protected function lazyload($relation) {
     // ...
   }

   public function __get($key) {
     if (isset($this->lazyloads[$key]) {
       return $this->lazyloads[$key];
     } else {
       return $this->lazyload($key);
     }
   }
}
参见:

@Robert K或(例如):

每个返回的对象必须有一个神奇的方法
\uu get
,该方法返回一个对象。

@Robert K或(例如):

每个返回的对象必须有一个神奇的方法
\uu get
,该方法返回一个对象

class A
{
    protected $objects = array();

    public function __get($name)
    {
        if(isset($this->objects[$name])) {
            return $this->objects[$name];
        }
        return null; // or throw \Exception
    }
}
class B
{
    protected $objects = array();

    public function __get($name)
    {
        // for example: $this->objects[$name] is type of A
        if(isset($this->objects[$name])) {
            return $this->objects[$name];
        }
        return null; // or throw \Exception
    }
}