PHP Conference Nagoya 2025

La classe Volatile

(PECL pthreads >= 3.0.0)

Introduction

La classe Volatile est nouvelle dans pthreads v3. Son introduction est une conséquence des nouvelles sémantiques d'immutabilité des membres Threaded des classes Threaded. La classe Volatile permet la mutabilité de ses membres Threaded, et est également utilisée pour stocker des tableaux PHP dans des contextes Threaded.

Synopsis de la classe

class Volatile extends Threaded implements Collectable, Traversable {
/* Méthodes héritées */
public Threaded::chunk(int $size, bool $preserve): array
public Threaded::extend(string $class): bool
public Threaded::merge(mixed $from, bool $overwrite = ?): bool
public Threaded::synchronized(Closure $block, mixed ...$args): mixed
public Threaded::wait(int $timeout = ?): bool
}

Exemples

Exemple #1 Nouvelles sémantiques d'immutabilité de Threaded

<?php

class Task extends Threaded
{
public function
__construct()
{
$this->data = new Threaded();

// essaie de remplacer une propriété Threaded d'une classe Threaded (invalide)
$this->data = new stdClass();
}
}

var_dump((new Task())->data);

Résultat de l'exemple ci-dessus est similaire à :

RuntimeException: Threaded members previously set to Threaded objects are immutable, cannot overwrite data in %s:%d

Exemple #2 Cas d'utilisation de Volatile

<?php

class Task extends Volatile
{
public function
__construct()
{
$this->data = new Threaded();

// essaie de remplacer une propriété Threaded d'une classe Volatile (valide)
$this->data = new stdClass();
}
}

var_dump((new Task())->data);

Résultat de l'exemple ci-dessus est similaire à :

object(stdClass)#3 (0) {
}
add a note

User Contributed Notes 1 note

up
1
synnus at gmail dot com
5 years ago
<?php

// just use extends volatile for use array
// is verry good

class libvar extends Volatile
{
private
$_adresse = '127.0.0.1';
private
$_port = 10000;

public
$socket;
public
$list_socket = array();
public
$list_error = array();

public function
__construct(){ }

public function
set_list($val) { $ct = count($this->list_socket); $this->list_socket[ $ct ] = $val; return $ct; }
public function
set_socket($val) { $this->socket = $val; return $this->socket; }
public function
set_error($val) { $this->list_error[ count($this->list_error) ] = $val; }

public function
unset_list($val) { unset($this->list_error[ $val ]); }

public function
get_socketinlist($val) { return $this->list_socket[$val]; }
public function
get_adresse() { return $this->_adresse; }
public function
get_port() { return $this->_port; }
public function
get_socket() { return $this->socket; }
}

?>
To Top