Как создать новый экземпляр класса при использовании переменной - PullRequest
0 голосов
/ 21 сентября 2011

Трудно объяснить, что я имею в виду, вот пример.

class mysql {

    public function __construct(){
        //connect to db and select table
    }
    ....
}


class Index Extends perent_class {

    public $mysql;

    public function no_mysql_required(){

        //this function might be called and no mysql is required 

    }

    public function mysql_required(){..}  // this needs mysql. 
    public function mysql_required2(){..} // this needs mysql.
    public function mysql_required3(){..} // this needs mysql.

}


Опция 1:
$this->mysql = new mysql();
добавить это ко всем функциям, которым требуется соединение с mysql, но можно вызвать две из этих функций, что создаст два соединения с mysql, что плохо.

Вариант 2:

if( !is_object($this-mysql) ) $this->mysql = new Mysql();
Это создаст одновременно только один объект mysql и решит проблему, но при этом создаст очень повторяющийся код в функциях. Создание и вызов функции $ this-> start_mysql () также будут повторяться.

Так что я действительно хочу всякий раз, когда я вызываю $ this-> mysql-> function (); даже если он еще не создан, создать «$ this-> mysql = new Mysql» каким-либо образом в индексе perent_class автоматически и после его создания, чтобы не создавать его заново при вызове новой функции. Возможно, я делаю это неправильно, и если есть лучшее решение для того, что я делаю, пожалуйста, напишите об этом.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

То, что вы хотите сделать, это использовать шаблон синглтона для класса mysql. Таким образом, у вас нет ненужных открытых соединений. Так что это будет выглядеть примерно так

Ваш класс MySQL

class Mysql{
    private function __construct(){ } 

    private static $instance;
    .
    .
 public static function singleton(){
        if (!isset(self::$instance)) {
            $c = __CLASS__; 
            self::$instance = new $c;
         }

       return self::$instance;
  }

И теперь вы будете использовать это в других классах.

$mysql = Mysql::singleton(); 
0 голосов
/ 21 сентября 2011

Если я правильно понял ваш вопрос, похоже, вы хотите использовать шаблон проектирования «Синглтон». Это позволяет вам создавать только один экземпляр класса; попытка создать второй экземпляр возвращает только исходный экземпляр. Вот выдержка из кода:

<?php

class mysql {
  private static $mysql;

  public $testProperty;

  private function __construct() { } // Declared private so cannot instantiate objects in client code.

  public static function instance() {
    if (!isset(self::$mysql)) {
      self::$mysql = new self();
    }
    return self::$mysql;
   }
 }

?>

Используя этот шаблон, вызов mysql::instance(); вернет новый экземпляр объекта mysql, если он не был создан. Если он был создан, он вернет тот же экземпляр. Таким образом, у вас есть только один экземпляр объекта. Проверьте это, сделав несколько звонков на mysql::instance():

$instance1 = mysql::instance();
$instance1->testProperty = 'abc';
var_dump($instance1->testProperty);

$instance2 = mysql::instance();
var_dump($instance2->testProperty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...