использования фунции __sleep() и __wakeup() в классах php5

texrdcom

Новичок
использования фунции __sleep() и __wakeup() в классах php5

Проблема в том что надо создать класс в которого некоторые функции (которые будут заданны в его конструкторе) будут выполняться однажды гарантированно! (без применения паттерна одиночки)
Данные функции связанны с чтениям файлов, вычеслениями и так далее.

То есть мы имеем класс объект которого может понадобиться в системе различным классам, и при создании данного обьекта первый раз его методы должны быть выполненны полностью однажды.

Отсюда и пришла мысль изпользовать функции __sleep() и __wakeup() .

Вот пример:
PHP:
<?php
class test
{
    private $fileIni='config.ini';

    private $arrayConfig;

    function __construct()
    {
        $this->reading_config();
    }

    public function __sleep()
    {
        // по идеи вызываеться сериализация - не чего не делаем.
    }

    public function __wakeup()
    {
        // Пробуждения - выполняеться данная функция еще раз  ? или
        // востаноавливаються результаты её работы ?
        $this->reading_config();
    }
    function reading_config()
    {
        $this->arrayConfig=parse_ini_file($this->fileIni);
        return;
    }

}
// Создаем объект класса (а)
$a=new test;
// Содаем объект класса (b)
$b=new test;


?>
Вопрос сколько раз будет прочтен - открыт файл config.ini
один раз или два ?
Как используя функции __sleep() и __wakeup() сделать так чтобы файл был прочтен один раз ?
 

Panchous

Павел
дурдом...
ты неправильно понял смысл функций __sleep() и __wakeup().

hint: может просто статический массив с конфигом использовать?
 

texrdcom

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

-~{}~ 23.12.05 16:52:

Потому и пример написал и спросил:
Как используя функции __sleep() и __wakeup() сделать так чтобы файл был прочтен один раз ?
 

Panchous

Павел
для начала объясни задачу РУССКИМ ЯЗЫКОМ.
желательно связно и с пунктуацией
 

texrdcom

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

Извини но я не понимаю что тебе не понятно?
 

texrdcom

Новичок
я тебя уверяю на 100% нужны буду признателен если обясниш в чем мои заблуждения !
 

Gas

может по одной?
texrdcom
имхо для твоей задачи статические атрибуты самое то, без всяких __sleep() и __wakeup()
 

kvf77

Red Devil
texrdcom

давай ты перестанешь нам рассказывать 100 или 150 процентов, а именно опишешь ЧЕГО ТЫ ХОЧЕШЬ русским языком, как просил Panchous
 

texrdcom

Новичок
kvf77
Да я не чего не расказываю я задал контретный вопрос и хотел получить такойже ответ что тебя лично смутило?

-~{}~ 23.12.05 19:51:

Вот есть пример с манна:
примения данных функции но для соедения с базой:
PHP:
class Connection {
   protected $link;
   private $server, $username, $password, $db;
   
   public function __construct($server, $username, $password, $db)
   {
       $this->server = $server;
       $this->username = $username;
       $this->password = $password;
       $this->db = $db;
       $this->connect();
   }
   
   private function connect()
   {
       $this->link = mysql_connect($this->server, $this->username, $this->password);
       mysql_select_db($this->db, $this->link);
   }
   
   public function __sleep()
   {
       mysql_close($this->link);
   }
   
   public function __wakeup()
   {
       $this->connect();
   }
}
Утверждаеться что сколько обьектов не будет созданно данного класса все равно будет установленно одно соединения с базой так ?
Также можно сделать через паттерн одиночку, сохранить объект в статическом атрибуте и через статическую функцию отдавать данный обьект при запросе.
Это все понятно, но как проверить с помощью php кода что функция connect была вызванна однажды ?
 

itprog

Cruftsman
Ну почему одно?
__sleep() и __wakeup() просто вызываются при serialize() и unserialize()
 

texrdcom

Новичок
itprog
Да потому не вериш проверяй :) .
serialize() и unserialize() - да я знаю но явных вызовов данных функций нету в примере как видиш, отсюда и мои вопроссы
что именно делают функции __sleep() и __wakeup()
 

Profic

just Profic (PHP5 BetaTeam)
Утверждаеться что сколько обьектов не будет созданно данного класса все равно будет установленно одно соединения с базой так ?
Где такое утверждается?
[m]serialize[/m]() checks if your class has a function with the magic name __sleep. If so, that function is executed prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized.
The intended use of __sleep is to close any database connections that the object may have, commit pending data or perform similar cleanup tasks. Also, the function is useful if you have very large objects which do not need to be saved completely.
Conversely, unserialize() checks for the presence of a function with the magic name __wakeup. If present, this function can reconstruct any resources that the object may have.
The intended use of __wakeup is to reestablish any database connections that may have been lost during serialization and perform other reinitialization tasks.
Тут ни слова про это.
Больше нигде эти ф-ции ни при каких обстоятельтвах не используются.
 

texrdcom

Новичок
Вот цитата ман:
__sleep and __wakeup
serialize() checks if your class has a function with the magic name __sleep. If so, that function is executed prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized.

The intended use of __sleep is to close any database connections that the object may have, commit pending data or perform similar cleanup tasks. Also, the function is useful if you have very large objects which do not need to be saved completely.

Conversely, unserialize() checks for the presence of a function with the magic name __wakeup. If present, this function can reconstruct any resources that the object may have.

The intended use of __wakeup is to reestablish any database connections that may have been lost during serialization and perform other reinitialization tasks.

Пример 19-26. Sleep and wakeup

<?php
class Connection {
protected $link;
private $server, $username, $password, $db;

public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}

private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}

public function __sleep()
{
mysql_close($this->link);
}

public function __wakeup()
{
$this->connect();
}
}
?>
Конект получаеться один, функция приват кроме конструктора естественно ни кто ее не вызовет.
 

Gas

может по одной?
PHP:
class test 
{ 
    private static $arrayConfig; 

    function __construct() 
    { 
        $this->reading_config(); 
    } 

    function reading_config() 
    { 
        if (empty(self::$arrayConfig)) {
          self::$arrayConfig = array('test'); 
          echo 'call<br>';
        }        
    } 

}

$a = new test;
$b = new test;
$c = new test;
 
Сверху