<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>The Volatile class</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="cond.wait.html">Cond::wait</a></div> <div class="next" style="text-align: right; float: right;"><a href="book.pht.html">pht</a></div> <div class="up"><a href="book.pthreads.html">pthreads</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="class.volatile" class="reference"> <h1 class="title">The Volatile class</h1> <div class="partintro"><p class="verinfo">(PECL pthreads >= 3.0.0)</p> <div class="section" id="volatile.intro"> <h2 class="title">Introduction</h2> <p class="para"> The <strong class="classname">Volatile</strong> class is new to pthreads v3. Its introduction is a consequence of the new immutability semantics of <a href="class.threaded.html" class="classname">Threaded</a> members of <a href="class.threaded.html" class="classname">Threaded</a> classes. The <strong class="classname">Volatile</strong> class enables for mutability of its <a href="class.threaded.html" class="classname">Threaded</a> members, and is also used to store PHP arrays in <a href="class.threaded.html" class="classname">Threaded</a> contexts. </p> </div> <div class="section" id="volatile.synopsis"> <h2 class="title">Class synopsis</h2> <div class="classsynopsis"> <div class="ooclass"></div> <div class="classsynopsisinfo"> <span class="ooclass"> <strong class="classname">Volatile</strong> </span> <span class="ooclass"> <span class="modifier">extends</span> <a href="class.threaded.html" class="classname">Threaded</a> </span> <span class="oointerface">implements <span class="interfacename"><a href="class.collectable.html" class="interfacename">Collectable</a></span> </span> <span class="oointerface">, <span class="interfacename"><a href="class.traversable.html" class="interfacename">Traversable</a></span> </span> {</div> <div class="classsynopsisinfo classsynopsisinfo_comment">/* Inherited methods */</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">array</span> <span class="methodname"><a href="threaded.chunk.html" class="methodname">Threaded::chunk</a></span> ( <span class="methodparam"><span class="type">int</span> <code class="parameter">$size</code></span> , <span class="methodparam"><span class="type">bool</span> <code class="parameter">$preserve</code></span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">int</span> <span class="methodname"><a href="threaded.count.html" class="methodname">Threaded::count</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.extend.html" class="methodname">Threaded::extend</a></span> ( <span class="methodparam"><span class="type">string</span> <code class="parameter">$class</code></span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">Threaded</span> <span class="methodname"><a href="threaded.from.html" class="methodname">Threaded::from</a></span> ( <span class="methodparam"><span class="type"><a href="class.closure.html" class="type Closure">Closure</a></span> <code class="parameter">$run</code></span> [, <span class="methodparam"><span class="type"><a href="class.closure.html" class="type Closure">Closure</a></span> <code class="parameter">$construct</code></span> [, <span class="methodparam"><span class="type">array</span> <code class="parameter">$args</code></span> ]] )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">array</span> <span class="methodname"><a href="threaded.getterminationinfo.html" class="methodname">Threaded::getTerminationInfo</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="thread.isrunning.html" class="methodname">Threaded::isRunning</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.isterminated.html" class="methodname">Threaded::isTerminated</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.iswaiting.html" class="methodname">Threaded::isWaiting</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.lock.html" class="methodname">Threaded::lock</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.merge.html" class="methodname">Threaded::merge</a></span> ( <span class="methodparam"><span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$from</code></span> [, <span class="methodparam"><span class="type">bool</span> <code class="parameter">$overwrite</code></span> ] )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.notify.html" class="methodname">Threaded::notify</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.notifyone.html" class="methodname">Threaded::notifyOne</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.pop.html" class="methodname">Threaded::pop</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">void</span> <span class="methodname"><a href="threaded.run.html" class="methodname">Threaded::run</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">mixed</span> <span class="methodname"><a href="threaded.shift.html" class="methodname">Threaded::shift</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">mixed</span> <span class="methodname"><a href="threaded.synchronized.html" class="methodname">Threaded::synchronized</a></span> ( <span class="methodparam"><span class="type"><a href="class.closure.html" class="type Closure">Closure</a></span> <code class="parameter">$block</code></span> [, <span class="methodparam"><span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$...</code></span> ] )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.unlock.html" class="methodname">Threaded::unlock</a></span> ( <span class="methodparam">void</span> )</div> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="type">bool</span> <span class="methodname"><a href="threaded.wait.html" class="methodname">Threaded::wait</a></span> ([ <span class="methodparam"><span class="type">int</span> <code class="parameter">$timeout</code></span> ] )</div> }</div> </div> <div class="section" id="volatile.examples"> <h2 class="title">Examples</h2> <div class="example" id="example-4544"> <p><strong>Example #1 New immutability semantics of Threaded</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Task </span><span style="color: #007700">extends </span><span style="color: #0000BB">Threaded<br /></span><span style="color: #007700">{<br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">data </span><span style="color: #007700">= new </span><span style="color: #0000BB">Threaded</span><span style="color: #007700">();<br /><br /> </span><span style="color: #FF8000">// attempt to overwrite a Threaded property of a Threaded class (invalid)<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">data </span><span style="color: #007700">= new </span><span style="color: #0000BB">StdClass</span><span style="color: #007700">();<br /> }<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">((new </span><span style="color: #0000BB">Task</span><span style="color: #007700">())-></span><span style="color: #0000BB">data</span><span style="color: #007700">);</span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> RuntimeException: Threaded members previously set to Threaded objects are immutable, cannot overwrite data in %s:%d </pre></div> </div> </div> <div class="example" id="example-4545"> <p><strong>Example #2 Volatile use-case</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Task </span><span style="color: #007700">extends </span><span style="color: #0000BB">Volatile<br /></span><span style="color: #007700">{<br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">data </span><span style="color: #007700">= new </span><span style="color: #0000BB">Threaded</span><span style="color: #007700">();<br /><br /> </span><span style="color: #FF8000">// attempt to overwrite a Threaded property of a Volatile class (valid)<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">data </span><span style="color: #007700">= new </span><span style="color: #0000BB">StdClass</span><span style="color: #007700">();<br /> }<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">((new </span><span style="color: #0000BB">Task</span><span style="color: #007700">())-></span><span style="color: #0000BB">data</span><span style="color: #007700">);</span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> object(stdClass)#3 (0) { } </pre></div> </div> </div> </div> </div> </div> <hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="cond.wait.html">Cond::wait</a></div> <div class="next" style="text-align: right; float: right;"><a href="book.pht.html">pht</a></div> <div class="up"><a href="book.pthreads.html">pthreads</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>