Как мне воспроизвести парадигму MongoDB API?

#php #oop #mongodb

#php #ооп #mongodb

Вопрос:

Отличный PHP-драйвер MongoDB позволяет мне писать PHP-код, который выглядит следующим образом:

 $mongo = new mongo("mongodb://path.to.my.server.com:27017");
$cnt = $mongo->db_name->table->count();
  

Более того, я также могу написать аналогичный код для несуществующих таблиц:

 $mongo->new_db_name->table->save(array('name' => 'Jimmy'));
echo $mongo->new_db_name->table->count();
  

Mongo Класс является родительским объектом, созданным Mongo() конструктором, и, похоже, он создает дочерние MongoCollection переменные ( db_name и new_db_name , соответственно) «на лету», по мере необходимости. Как драйвер Mongo это делает? Как он узнает, что нужно создать объект типа MongoCollection , если общедоступная переменная не найдена? Драйвер является расширением PECL C; это необходимо для репликации этого поведения, или кто-нибудь может сделать что-то подобное в PHP?

Комментарии:

1. В нем используются различные из следующих: php.net/manual/en/language.oop5.magic.php

2. Хорошая ссылка, я не знал о многих из них. Спасибо!

Ответ №1:

Вы можете использовать класс, подобный этому, для достижения того же:

 class mongolike {
  protected $dbs;
  function __get($name) {
    if (empty($this->dbs[$name])) {
      $this->dbs[$name] = new db($name);
    }
    return $this->dbs[$name]
  }
}
  

Комментарии:

1. Приятно, спасибо! Я не знал о многих из этих волшебных функций, всегда нужно изучать что-то новое.