Php 是否有一种方法可以为类中已定义但为空的属性设置_uget&_u set触发器

Php 是否有一种方法可以为类中已定义但为空的属性设置_uget&_u set触发器,php,Php,我试图理解php中是否有一个神奇的函数,当我试图访问如下对象属性时,它可以触发一个函数 class User { public $groups; function loadGroups(){ $this->groups[] = "a list of groups"; } function __get($name){ // Trigger on defined property such a

我试图理解php中是否有一个神奇的函数,当我试图访问如下对象属性时,它可以触发一个函数

class User {
      public $groups;

      function loadGroups(){
            $this->groups[] = "a list of groups";
      }

      function __get($name){
             // Trigger on defined property such as groups
             if($name == "groups"){
                 $this->loadGroups();
                 return $this->groups;
             }
      }
}

$user = new User();
foreach($user->groups as $group) // Is it possible to load $user->groups when it's accessed?
      echo $group;
我知道如果在类中定义了属性,即使属性设置为null或未定义,也不会触发_get&_集,但是,是否有其他方法可以触发已定义属性的某些内容,或者我必须为所有这些属性创建getter和setter,并确保在需要访问属性时始终调用它们,并确保在访问属性时加载它们?我不希望,因为这将导致许多变化,目前的制度,我正在工作

我很感谢任何信息或帮助,我可以得到结束这一章

//ZarToK

\uuuu get和uu set用于从不可访问的属性读取/写入数据。在这种情况下,不可访问的属性将是私有的或受保护的,而不是公共的。如果它们需要公开,那么从函数返回有什么不对

class User {
      public $groups;

      function loadGroups(){
            $this->groups[] = "a list of groups";
            return $this->groups;
      }
}

$user = new User();
foreach($user->loadGroups() as $group)
    echo $group;

我知道你想做什么,但我认为你问的问题不对。很明显,您正在尝试延迟加载

没有一种神奇的方法可以满足你的要求,但你可以创造出这样的东西。有两个选项:creatinggetter/setters选项——这与Java开发人员的做法更为一致;或者有protect the variable and use magic method选项,这对于框架API来说很好,但可能有点混乱

类用户{ 受保护的群体; 私有函数加载组{ $this->groups[]=“组列表”; } 公共函数\uu获取$name{ 如果$name=='groups'&&为空$this->groups{ $this->loadGroups; 返回$this->groups; } } } 或者,更具Java风格的方式:

类用户{ 受保护的群体; 私有函数加载组{ $this->groups[]=“组列表”; } 公共函数组{ 如果为空$this->groups{ $this->loadGroups; } 返回$this->groups; } }
在_构造上加载?@exussum很好,这将在ofc中工作,但我不想加载比需要更多的内容,这是一个小示例类。实际的类包含很多这样的数组,并从数据库中获取它的列表。在这种情况下,您不能只注释掉$groups的声明,然后在_uget中确定要加载哪个。我可以这样做,但这会导致类定义不能说明类本身。例如,如果我想生成一个文档。这可能是我的结局,但我希望有另一种方法:使变量私有或受保护?这就是我要使用的,受保护的方法,我会向任何有新的开始的人推荐Java方法,但在我的情况下,我必须在不影响已经使用这些foreach循环的应用程序的情况下进行更改。感谢@Navarr和Abracadver在简短的版本中提到这一点。