MVC фреймворкингизда барча моделларнинг отасини амалга ошириш

Келинг, барча моделларнинг ота классини амалга оширайлик:

/core/Model.php<?php
  namespace Core;
  
  class Model
  {
    private $link;
    
    public function __construct()
    {
      $this->link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
      mysqli_query($this->link, "SET NAMES 'utf8'");
    }
    
    protected function findOne($query)
    {
      // бу ерда қандайдир код бўлади
    }
    
    protected function findMany($query)
    {
      // бу ерда қандайдир код бўлади
    }
  }
?>

Кўриб турганингиздек, класс конструкторида биз маълумотлар базасига улашамиз. Аммо, бир муаммо бор: ҳар битта яратилаётган модель (агар контроллернинг битта ҳаракати ичида бир нечта модель бўлса) ўзининг маълумотлар базасига уланишни яратади, бу эса оптимал эмас.

Келинг, шундай қилайликки, маълумотлар базасига уланиш фақат биринчи яратилган модель учун яратилсин, қолган моделлар эса аллақачон яратилган уланишдан фойдалансин. Бунинг учун link хусусиятини статик қиламиз:

/core/Model.php<?php
  namespace Core;
  
  class Model
  {
    private static $link;
    
    public function __construct()
    {
      if (!self::$link) { // агар хусусият берилмаган бўлса, унда улашамиз
        self::$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        mysqli_query(self::$link, "SET NAMES 'utf8'");
      }
    }
    
    protected function findOne($query)
    {
      
    }
    
    protected function findMany($query)
    {
      
    }
  }
?>
Задание 1

Келтирилган Model класс кодини нусхалаб олинг ва уни /core/Model.php файлига жойланг.

Задание 2

Ушбу классда findOne услубини амалга оширинг. Унинг ишлашини текшириб кўринг.

Задание 3

Ушбу классда findMany услубини амалга оширинг. Унинг ишлашини текшириб кўринг.