php - 在 PHP 中延迟加载公共(public)类数据成员

标签 php lazy-loading public-members

我想在 PHP 中延迟加载一个类的公共(public)数据成员。假设我们有以下类:

<?php
class Dummy
{
    public $name;
    public $age;
    public $status_indicator;
}
?>

如果 $name$age$status_indicator 是私有(private)数据成员,我会通过它们的 getter 方法延迟加载它们,但由于它们是公开的——我不清楚如何延迟加载它们。这可能吗?

编辑: 有人评论说有一个方法叫做 __get 可能有助于解决这个问题,但我没看懂。

最佳答案

您可以使用 __get模拟在第一次访问时真正动态加载的公共(public)成员。当您尝试访问对象的未定义成员时,PHP 将调用 __get 并将您尝试访问的成员的名称传递给它。例如,访问 $x->my_variable 将调用 __get("my_variable") 如果该类定义了 __get_ 方法。

在这个例子中,$dummy->name 间接调用了 getter 方法 getName,它首先初始化了一个名为 $_name 的私有(private)成员访问:

<?php
class Dummy
{
  private $_name;

  public function __get($var) {
    if ($var == 'name') {
      return $this->getName();
    } else if ($var == 'age') {
      // ...
    } else {
      throw "Undefined variable $var";
    }
  }

  public function getName() {
    if (is_null($this->_name)) {
      // Initialize and cache the value for $name
      $this->_name = expensive_function();
    }
    return $this->_name;
  }
}

$dummy = new Dummy();
echo $dummy->name;

您可以类似地定义和调用其他访问器,例如 getAge

关于php - 在 PHP 中延迟加载公共(public)类数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640744/

相关文章:

php - 上传文件 - Android 到 Google App Engine (PHP)

java - 为什么在 Java 中将私有(private)内部类成员设为公有?

java - Freemarker:在模板中没有 getter 的情况下访问公共(public)字段

php - 为网络爬虫优化 PHP CURL

php - 在存储到数据库之前添加到用户输入值

java - Hibernate:拉取所有惰性集合的最佳实践

java - 使用 Java 延迟加载对象列表?

nhibernate - 使用 ActiveRecord 在 nHibernate 中急切加载延迟加载的实体

c# - 为什么不是所有字段/属性/方法都是公开的?

php - Laravel 5.2 Eloquent create() 方法显示外键异常但 save() 不显示任何错误