(PECL pthreads >= 3.0.0)
Введение
Класс Volatile является новым для pthreads v3. Его введение является следствием новой семантики неизменяемости членов Threaded классов Threaded. Класс Volatile обеспечивает изменчивость своих членов Threaded, а также используется для хранения массивов PHP в контекстах Threaded.
Обзор классов
class Volatile extends Threaded implements Collectable , Traversable {
/* Наследуемые методы */
public array Threaded::chunk ( int $size , bool $preserve )
public int Threaded::count ( void )
public bool Threaded::extend ( string $class )
public Threaded Threaded::from ( Closure $run [, Closure $construct [, array $args ]] )
public array Threaded::getTerminationInfo ( void )
public bool Threaded::isRunning ( void )
public bool Threaded::isTerminated ( void )
public bool Threaded::isWaiting ( void )
public bool Threaded::lock ( void )
public bool Threaded::merge ( mixed $from [, bool $overwrite ] )
public bool Threaded::notify ( void )
public bool Threaded::notifyOne ( void )
public bool Threaded::pop ( void )
public void Threaded::run ( void )
public mixed Threaded::shift ( void )
public mixed Threaded::synchronized ( Closure $block [, mixed $... ] )
public bool Threaded::unlock ( void )
public bool Threaded::wait ([ int $timeout ] )
}
Примеры
Пример #1 Новая семантика неизменяемости Threaded
<?php
class Task extends Threaded
{
public function __construct()
{
$this->data = new Threaded();
// попытка перезаписать свойство Threaded класса Threaded (недопустимо)
$this->data = new StdClass();
}
}
var_dump((new Task())->data);
Результатом выполнения данного примера будет что-то подобное:
RuntimeException: потоковые элементы, ранее установленные в потоковые объекты, неизменяемы, не могут перезаписывать данные в %s:%d
Пример #2 Volatile использование регистра
<?php
class Task extends Volatile
{
public function __construct()
{
$this->data = new Threaded();
// попытка перезаписать свойство Threaded класса Volatile (допустимо)
$this->data = new StdClass();
}
}
var_dump((new Task())->data);
Результатом выполнения данного примера будет что-то подобное:
object(stdClass)#3 (0) {
}