Php 使用->;对受保护的属性调用_get();操作人员
我的团队正在使用懒散加载技术从数据库中加载子对象。为此,我们使用magic _get()方法并进行数据库调用。我们的所有属性都受到保护,因此从对象外部调用uu 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')->
$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
}
}