Работа с классами из функций

puzer

Новичок
Работа с классами из функций

У меня такая проблема.

Есть класс для работы с БД, который открывается из основного скрипта, в этом скрипте подключаются самописные функции. Так вот необходимо из этих функций обращаться к уже открытому классу работы с БД, но сервер сообщает об ошибке, что-то вроде того что этот класс открыт не из этого объекта.

Вопрос такой, можно ли из функций каким-то образом обратится к уже открытому классу, или необходимо создавать новый в функции?
 

puzer

Новичок
Я так понял что перед функцией в классе нужно указывать ее видимость (public или ...)?

-~{}~ 09.08.06 10:03:

Если несложно, покажите на примере? А то у меня на работе PHP нет, а дома с интернетом проблема :)


//Класс для работы с БД
class mysql_class {

Function Open(){
echo "bla bla bla";
}
}

//Открываем класс
$db = new mysql_class();

//Есть другая функция
function drugaya(){

$db->Open(); //Вот тут выскакивает ошибка

}
 

sage

Новичок
1.
PHP:
function drugaya($db){
    $db->Open(); 
} 
drugaya($db); // bla bla bla
2.
PHP:
function drugaya(){
    global $db;
    $db->Open(); 
} 
drugaya(); // bla bla bla
-~{}~ 09.08.06 17:07:

и об этом очень хорошо написано по той ссылке, что я тебе дал.
 

zarus

Хитрожопый макак
А мне больше понравился вариант Singleton
PHP:
class someclass {
  public static function get() {
    static $class = null;
    if ( null == $class ) {
      $class = new someclass();
    }
    return $class;
  }
  private function __construct() {
  }
  public function somemethod () {
  }
}
function somefunction() {
  someclass::get()->somemethod();
}
Вот только к памяти он очень требовательный... А есть какой-нибудь вариант, чтобы обращаться напрямую к методам класса, минуя someclass::get(), т.е. сразу someclass::somemethod()?
 

HraKK

Мудак
Команда форума
Статические функции:
PHP:
class test{
     function showmetest()
     {
           print "test";
     }
}
test::showmetest();
Но в твоем случии мне кажется больше подходит паттерн registry
 

zarus

Хитрожопый макак
Автор оригинала: HraKK
Статические функции:
PHP:
class test{
     function showmetest()
     {
           print "test";
     }
}
test::showmetest();
Нотайс выдает - вызов нестатичной функции, как статичной...

-~{}~ 09.08.06 11:21:

PHP:
<?php

class Registry {

    function RegisterClass ($className, &$classInstance) {
        $GLOBALS['framework']['classes'][strtolower($className)] = &$classInstance;
    }

    function RegisterSetting ($name, $value) {
        $GLOBALS['framework']['settings'][strtolower($name)] = $value;
    }

    function &RetrieveClass ($className) {
        return $GLOBALS['framework']['classes'][strtolower($className)];
    }

    function RetrieveSetting ($name) {
        return $GLOBALS['framework']['settings'][strtolower($name)];
    }

}
?>
И как это использовать?
Была у меня функция наподобие описанного выше класса
PHP:
 function &getSingle ( $className ) {
   if ( !isset( $GLOBALS['classes'][$className] ) ) {
     $GLOBALS['classes'][$className] = new $className();
   }
   return $GLOBALS['classes'][$className];
}
Но такое решение мне не нравится. Уж лушче синглтон.
 

zerkms

TDD infected
Команда форума
zarus
ужас.... зачем нужен регистри если он всё равно всё хранит в глобальной области видимости??
 

Gorynych

Посетитель PHP-Клуба
почти согласен с zarus в части Singleton.

но обычно использую вот такую реализацию, оcнованную на однократной инициализации статической переменной:
Код:
function getDBLink() {
    static $db = null;

    if ( !isset($db) ) {
        $db = new DataObj();
    }
    return $db;
}
это внешняя по отношению к классу DataObj функция, поэтому ее область видимости не связана с созданием объекта этого класса.

тащить объект через global мне кажется более ресурсоемким занятием.

P.S. на всякий случай укажу - PHP 5 :)
 

HraKK

Мудак
Команда форума
Обьект не хранится в GLOBALS, там храниться только указатель!
в итоге у тебя получится:
PHP:
function drugaya(){

registry::RetrieveClass('db')->Open(); 
}
 

zarus

Хитрожопый макак
Автор оригинала: HraKK
Обьект не хранится в GLOBALS, там храниться только указатель!
в итоге у тебя получится:
PHP:
function drugaya(){

registry::RetrieveClass('db')->Open(); 
}
И чем такое решение лучше
db::get()->Open();
?

-~{}~ 09.08.06 13:05:

Автор оригинала: zerkms
zarus
ужас.... зачем нужен регистри если он всё равно всё хранит в глобальной области видимости??
Это не мое. Это я привел код Registry, предлагаемой HraKK.
 
Сверху