6 ★
4. Special Datatypes -
9 <meta property=
"og:title" content=
"ion/: Tutorial/:4. Special Datatypes">
10 <meta name=
"viewport" content=
"width=1200, initial-scale=0.5">
11 <base href=
"/ext-ion/v0.2/">
12 <meta http-equiv=
"Content-Location" content=
"/ext-ion/v0.2/ion/: Tutorial/:4. Special Datatypes">
13 <link rel=
"stylesheet" href=
"index.css">
15 <link rel=
"shortcut icon" href=
"/ext-ion/v0.2/favicon.ico">
23 <a href=
"https://github.com/awesomized/ext-ion/edit/master/ion.stub.php">Edit
</a>
28 <li>↰ <a href=
"./">Home
</a>
33 ↑ <a href=
"./ion">
39 ↑ <a href=
"./ion/: Tutorial">
45 ↻ <strong><a href=
"./ion/: Tutorial/:4. Special Datatypes">★
4. Special Datatypes
</a></strong>
51 <li>↲ <a href=
"./ion/: Tutorial/:1. Getting started">★
1. Getting started
</a></li>
53 <li>↲ <a href=
"./ion/: Tutorial/:2. What is ion">★
2. What is ion
</a></li>
55 <li>↲ <a href=
"./ion/: Tutorial/:3. Standard Datatypes">★
3. Standard Datatypes
</a></li>
57 <li>↲ <a href=
"./ion/: Tutorial/:5. Symbols, Tables and Catalogs">★
5. Symbols, Tables and Catalogs
</a></li>
67 <meta charset=
"utf-8"><h1>
68 <a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#">#
</a>Special Datatypes
</h1><p>There are a handful of data types treated in a specific way in PHP; consider the following examples:
</p><h2 id=
"Symbols">Symbols
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Symbols">#
</a>
69 </h2><p>Symbols are much like strings, in that they are Unicode character sequences. The primary difference is the intended semantics: symbols represent semantic identifiers as opposed to textual literal values. Symbols are case sensitive.
</p><p>In the text format, symbols are delimited by single-quotes and use the same
<a href=
"https://amzn.github.io/ion-docs/docs/spec.html#escapes">escape characters
</a>.
</p><p>See
<a href=
"https://amzn.github.io/ion-docs/docs/symbols.html">Ion Symbols
</a> for more details about symbol representations and symbol tables, and our section on
<a href=
"ion/:%20Tutorial/:5.%20Symbols,%20Tables%20and%20Catalogs">Symbols, Tables and Catalogs
</a> for a distilled read.
</p><h2 id=
"Decimals">Decimals
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Decimals">#
</a>
70 </h2><p>See the
<a href=
"ion/:%20Tutorial/:3.%20Standard%20Datatypes#Reals">section on reals
</a> for an introduction.
</p><pre><code><span style=
"color: inherit" class=
"html">
71 <span style=
"color: inherit" class=
"default"><?php
<br>$d
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">ion\Decimal
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">123</span><span style=
"color: inherit" class=
"keyword">);
<br>echo
</span><span style=
"color: inherit" class=
"default">ion\serialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$d
</span><span style=
"color: inherit" class=
"keyword">),
</span><span style=
"color: inherit" class=
"string">" = "</span><span style=
"color: inherit" class=
"keyword">,
</span><span style=
"color: inherit" class=
"default">$d
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">isInt
</span><span style=
"color: inherit" class=
"keyword">() ?
</span><span style=
"color: inherit" class=
"string">"int" </span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"string">"noint"</span><span style=
"color: inherit" class=
"keyword">,
</span><span style=
"color: inherit" class=
"string">"\n"</span><span style=
"color: inherit" class=
"keyword">;
<br></span><span style=
"color: inherit" class=
"comment">//
123d0 = int
<br><br></span><span style=
"color: inherit" class=
"default">$d
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">ion\Decimal
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"string">"123.123"</span><span style=
"color: inherit" class=
"keyword">);
<br>echo
</span><span style=
"color: inherit" class=
"default">ion\serialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$d
</span><span style=
"color: inherit" class=
"keyword">),
</span><span style=
"color: inherit" class=
"string">" = "</span><span style=
"color: inherit" class=
"keyword">,
</span><span style=
"color: inherit" class=
"default">$d
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">isInt
</span><span style=
"color: inherit" class=
"keyword">() ?
</span><span style=
"color: inherit" class=
"string">"int" </span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"string">"noint" </span><span style=
"color: inherit" class=
"keyword">,
</span><span style=
"color: inherit" class=
"string">"\n"</span><span style=
"color: inherit" class=
"keyword">;
<br></span><span style=
"color: inherit" class=
"comment">//
123.123 = noint
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
73 </code></pre><p>See the
<a href=
"https://amzn.github.io/ion-docs/docs/spec.html#real-numbers">official ION spec about real numbers
</a> and also
<a href=
"https://amzn.github.io/ion-docs/docs/float.html">Ion Float
</a> and
<a href=
"https://amzn.github.io/ion-docs/docs/decimal.html">Ion Decimals
</a> for more notes.
</p><h2 id=
"LOBs">LOBs
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#LOBs">#
</a>
74 </h2><h3 id=
"BLob">BLob
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#BLob">#
</a>
75 </h3><p>The
<code>blob
</code> type allows embedding of arbitrary raw binary data. Ion treats such data as a single (though often very large) value. It does no processing of such data other than passing it through intact.
</p><p>In the text format,
<code>blob
</code> values are denoted as
<a href=
"https://tools.ietf.org/html/rfc4648">RFC
4648</a>-compliant
<a href=
"http://en.wikipedia.org/wiki/Base64">Base64
</a> text within two pairs of curly braces.
</p><pre><code><span style=
"color: inherit" class=
"html">
76 {{ dHdvIHBhZGRpbmcgY2hhcmFjdGVycw== }}
<br></span>
77 </code></pre><h3 id=
"CLob">CLob
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#CLob">#
</a>
78 </h3><p>The
<code>clob
</code> type is similar to
<code>blob
</code> in that it holds uninterpreted binary data. The difference is that the content is expected to be text, so we use a text notation that’s more readable than Base64.
</p><pre><code><span style=
"color: inherit" class=
"html">
79 {{
"This is a CLOB of text." }}
<br></span>
80 </code></pre><p>See the official ION specification on
<a href=
"https://amzn.github.io/ion-docs/docs/spec.html#blob">Blobs
</a> and
<a href=
"https://amzn.github.io/ion-docs/docs/spec.html#clob">Clobs
</a>.
</p><h2 id=
"Timestamps">Timestamps
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Timestamps">#
</a>
81 </h2><p>Timestamps represent a specific moment in time, always include a local offset, and are capable of arbitrary precision.
</p><p>Instances of
<a href=
"ion/Timestamp">ion\Timestamp
</a> are really just plain
<code><a href=
"https://php.net/manual/en/class.datetime">\DateTime
</a></code> objects augmented with
<code><a href=
"https://php.net/manual/en/class.stringable">Stringable
</a></code> and ION specific formatting.
</p><pre><code><span style=
"color: inherit" class=
"html">
82 <span style=
"color: inherit" class=
"default"><?=
<br></span><span style=
"color: inherit" class=
"keyword">new
</span><span style=
"color: inherit" class=
"default">ion\Timestamp
</span><span style=
"color: inherit" class=
"keyword">(
<br> </span><span style=
"color: inherit" class=
"default">precision
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"default">ion\Timestamp\Precision
</span><span style=
"color: inherit" class=
"keyword">::
</span><span style=
"color: inherit" class=
"default">FracTZ
</span><span style=
"color: inherit" class=
"keyword">,
<br>)
<br> <br> </span><span style=
"color: inherit" class=
"comment">//
2022-
02-
25T16:
11:
54.118+
00:
00<br> <br></span><span style=
"color: inherit" class=
"default">?
><br></span>
84 </code></pre><pre><code><span style=
"color: inherit" class=
"html">
85 <span style=
"color: inherit" class=
"default"><?=
<br></span><span style=
"color: inherit" class=
"keyword">new
</span><span style=
"color: inherit" class=
"default">ion\Timestamp
</span><span style=
"color: inherit" class=
"keyword">(
<br> </span><span style=
"color: inherit" class=
"default">precision
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"default">ion\Timestamp\Precision
</span><span style=
"color: inherit" class=
"keyword">::
</span><span style=
"color: inherit" class=
"default">Day
<br></span><span style=
"color: inherit" class=
"keyword">)
<br> <br> </span><span style=
"color: inherit" class=
"comment">//
2022-
02-
25T
<br> <br></span><span style=
"color: inherit" class=
"default">?
><br></span>
87 </code></pre><pre><code><span style=
"color: inherit" class=
"html">
88 <span style=
"color: inherit" class=
"default"><?=
<br></span><span style=
"color: inherit" class=
"keyword">new
</span><span style=
"color: inherit" class=
"default">ion\Timestamp
</span><span style=
"color: inherit" class=
"keyword">(
<br> </span><span style=
"color: inherit" class=
"default">precision
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"default">ion\Timestamp\Precision
</span><span style=
"color: inherit" class=
"keyword">::
</span><span style=
"color: inherit" class=
"default">MinTZ
</span><span style=
"color: inherit" class=
"keyword">,
<br> </span><span style=
"color: inherit" class=
"default">format
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"default">ion\Timestamp\Format
</span><span style=
"color: inherit" class=
"keyword">::
</span><span style=
"color: inherit" class=
"default">Min
</span><span style=
"color: inherit" class=
"keyword">,
<br> </span><span style=
"color: inherit" class=
"default">datetime
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"string">"2020-03-15T12:34"</span><span style=
"color: inherit" class=
"keyword">,
<br> </span><span style=
"color: inherit" class=
"default">timezone
</span><span style=
"color: inherit" class=
"keyword">: new
</span><span style=
"color: inherit" class=
"default">DateTimeZone
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"string">"Europe/Vienna"</span><span style=
"color: inherit" class=
"keyword">)
<br>)
<br> <br> </span><span style=
"color: inherit" class=
"comment">//
2020-
03-
15T12:
34+
01:
00<br> <br></span><span style=
"color: inherit" class=
"default">?
><br></span>
90 </code></pre><p>See also the
<a href=
"https://amzn.github.io/ion-docs/docs/spec.html#timestamp">official ION Timestamp specification
</a>.
</p><h2 id=
"Special.PHP.Objects">Special PHP Objects
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Special.PHP.Objects">#
</a>
91 </h2><h3 id=
"Deprecated.Serializable:">Deprecated Serializable:
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Deprecated.Serializable:">#
</a>
93 <p><em><strong>NOTE:
</strong></em><br>
94 The
<em>interface
</em> <code><a href=
"https://php.net/manual/en/class.serializable">Serializable
</a></code> has been deprecated in
8.1 and should be replaced with magic serialize methods.
</p>
95 </blockquote><pre><code><span style=
"color: inherit" class=
"html">
96 <span style=
"color: inherit" class=
"default"><?php
<br> <br></span><span style=
"color: inherit" class=
"keyword">class
</span><span style=
"color: inherit" class=
"default">srlzbl
</span><span style=
"color: inherit" class=
"keyword">implements
</span><span style=
"color: inherit" class=
"default">\Serializable
</span><span style=
"color: inherit" class=
"keyword">{
<br> private
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"string">"foo"</span><span style=
"color: inherit" class=
"keyword">;
<br> public function
</span><span style=
"color: inherit" class=
"default">serialize
</span><span style=
"color: inherit" class=
"keyword">() {
<br> return
</span><span style=
"color: inherit" class=
"string">"bar"</span><span style=
"color: inherit" class=
"keyword">;
<br> }
<br> public function
</span><span style=
"color: inherit" class=
"default">unserialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">) {
<br> </span><span style=
"color: inherit" class=
"default">$this
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">data
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">;
<br> }
<br>}
<br><br></span><span style=
"color: inherit" class=
"default">$srlzbl
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">srlzbl
</span><span style=
"color: inherit" class=
"keyword">;
<br></span><span style=
"color: inherit" class=
"default">var_dump
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$srlzbl
</span><span style=
"color: inherit" class=
"keyword">);
<br><br></span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">ion\serialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$srlzbl
</span><span style=
"color: inherit" class=
"keyword">);
<br>echo
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">;
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> object(srlzbl)#
4 (
1) {
<br> [
"data":
"srlzbl":private]=
><br> string(
3)
"foo"<br> }
<br> <br> S::srlzbl::{{
"bar"}}
<br><br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
98 </code></pre><p>Everything as expected so far,
<code><a href=
"https://php.net/manual/en/class.serializable">Serializable
</a></code> return a
<code><a href=
"https://php.net/manual/en/language.types.string">string
</a></code>, but since they cannot indicate whether it's a valid UTF-
8 <code><a href=
"https://php.net/manual/en/language.types.string">string
</a></code>, a
<a href=
"ion/Type#CLob">ion\Type::CLob
</a> or
<a href=
"ion/Type#BLob">ion\Type::BLob
</a>, CLobs are assumed.
</p><p>Unserialization does not offer any surprises, either:
</p><pre><code><span style=
"color: inherit" class=
"html">
99 <span style=
"color: inherit" class=
"default"><?php
<br> <br>var_dump
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">ion\unserialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">));
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> object(srlzbl)#
4 (
1) {
<br> [
"data":
"srlzbl":private]=
><br> string(
3)
"bar"<br> }
<br><br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
101 </code></pre><h3 id=
"Magic.__serialize:">Magic __serialize:
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Magic.__serialize:">#
</a>
102 </h3><p>Implementing serialization behavior with magic methods is the preferred way since
8.1:
</p><pre><code><span style=
"color: inherit" class=
"html">
103 <span style=
"color: inherit" class=
"default"><?php
<br> <br></span><span style=
"color: inherit" class=
"keyword">class
</span><span style=
"color: inherit" class=
"default">magic
</span><span style=
"color: inherit" class=
"keyword">{
<br> private
</span><span style=
"color: inherit" class=
"default">string $foo
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"string">"foo"</span><span style=
"color: inherit" class=
"keyword">;
<br> function
</span><span style=
"color: inherit" class=
"default">__serialize
</span><span style=
"color: inherit" class=
"keyword">() : array {
<br> return [
</span><span style=
"color: inherit" class=
"string">"foo" </span><span style=
"color: inherit" class=
"keyword">=
> </span><span style=
"color: inherit" class=
"string">"bar"</span><span style=
"color: inherit" class=
"keyword">];
<br> }
<br> function
</span><span style=
"color: inherit" class=
"default">__unserialize
</span><span style=
"color: inherit" class=
"keyword">(array
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">) :
</span><span style=
"color: inherit" class=
"default">void
</span><span style=
"color: inherit" class=
"keyword">{
<br> foreach (
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">as
</span><span style=
"color: inherit" class=
"default">$k
</span><span style=
"color: inherit" class=
"keyword">=
> </span><span style=
"color: inherit" class=
"default">$v
</span><span style=
"color: inherit" class=
"keyword">)
<br> </span><span style=
"color: inherit" class=
"default">$this
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">$k
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">$v
</span><span style=
"color: inherit" class=
"keyword">;
<br> }
<br>}
<br><br></span><span style=
"color: inherit" class=
"default">$magic
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">magic
</span><span style=
"color: inherit" class=
"keyword">;
<br></span><span style=
"color: inherit" class=
"default">var_dump
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$magic
</span><span style=
"color: inherit" class=
"keyword">);
<br><br></span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">ion\serialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$magic
</span><span style=
"color: inherit" class=
"keyword">);
<br>echo
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">;
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> object(magic)#
6 (
1) {
<br> [
"foo":
"magic":private]=
><br> string(
3)
"foo"<br> }
<br><br> O::magic::{foo:
"bar"}
<br><br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
105 </code></pre><p>Again, unserialization yields the expected results:
</p><pre><code><span style=
"color: inherit" class=
"html">
106 <span style=
"color: inherit" class=
"default"><?php
<br> <br>var_dump
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">ion\unserialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">));
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> object(magic)#
7 (
1) {
<br> [
"foo":
"magic":private]=
><br> string(
3)
"bar"<br> }
<br><br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
108 </code></pre><h3 id=
"Custom.serialize:">Custom serialize:
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Custom.serialize:">#
</a>
109 </h3><p>Customly serializable objects work like magic serializable objects, with custom names for the magic methods.
</p><pre><code><span style=
"color: inherit" class=
"html">
110 <span style=
"color: inherit" class=
"default"><?php
<br> <br></span><span style=
"color: inherit" class=
"keyword">class
</span><span style=
"color: inherit" class=
"default">custom
</span><span style=
"color: inherit" class=
"keyword">{
<br> private array
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">;
<br> function
</span><span style=
"color: inherit" class=
"default">init
</span><span style=
"color: inherit" class=
"keyword">(array
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">) :
</span><span style=
"color: inherit" class=
"default">void
</span><span style=
"color: inherit" class=
"keyword">{
<br> </span><span style=
"color: inherit" class=
"default">$this
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">data
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">$data
</span><span style=
"color: inherit" class=
"keyword">;
<br> }
<br> function
</span><span style=
"color: inherit" class=
"default">export
</span><span style=
"color: inherit" class=
"keyword">() : array {
<br> return
</span><span style=
"color: inherit" class=
"default">$this
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">data
</span><span style=
"color: inherit" class=
"keyword">;
<br> }
<br>}
<br><br></span><span style=
"color: inherit" class=
"default">$custom
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">custom
</span><span style=
"color: inherit" class=
"keyword">;
<br></span><span style=
"color: inherit" class=
"default">$custom
</span><span style=
"color: inherit" class=
"keyword">-
></span><span style=
"color: inherit" class=
"default">init
</span><span style=
"color: inherit" class=
"keyword">([
</span><span style=
"color: inherit" class=
"string">"foo" </span><span style=
"color: inherit" class=
"keyword">=
> </span><span style=
"color: inherit" class=
"string">"bar"</span><span style=
"color: inherit" class=
"keyword">]);
<br>echo
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">ion\serialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$custom
</span><span style=
"color: inherit" class=
"keyword">);
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> c::custom::{data:p::custom::{foo:
"bar"}}
<br> <br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
112 </code></pre><p>The above is actually the result of serializing a standard
<em>class
</em> backed PHP object, because we didn't implement any serialization primitives and did neither specify a custom method to call. So let's just do that:
</p><pre><code><span style=
"color: inherit" class=
"html">
113 <span style=
"color: inherit" class=
"default"><?php
<br> <br>$srlzr
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">ion\Serializer\Serializer
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">callCustomSerialize
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"string">"export"</span><span style=
"color: inherit" class=
"keyword">);
<br>echo
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">=
</span><span style=
"color: inherit" class=
"default">ion\serialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$custom
</span><span style=
"color: inherit" class=
"keyword">,
</span><span style=
"color: inherit" class=
"default">$srlzr
</span><span style=
"color: inherit" class=
"keyword">);
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> C::custom::{foo:
"bar"}
<br><br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
115 </code></pre><p>Note how this output compares to the output of the standard magic serializable object.
</p><p>Unserialization works as used to, except sepcifying thwe custom unserialization method to call:
</p><pre><code><span style=
"color: inherit" class=
"html">
116 <span style=
"color: inherit" class=
"default"><?php
<br> <br>$unsrlzr
</span><span style=
"color: inherit" class=
"keyword">= new
</span><span style=
"color: inherit" class=
"default">ion\Unserializer\Unserializer
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">callCustomUnserialize
</span><span style=
"color: inherit" class=
"keyword">:
</span><span style=
"color: inherit" class=
"string">"init"</span><span style=
"color: inherit" class=
"keyword">);
<br></span><span style=
"color: inherit" class=
"default">var_dump
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">ion\unserialize
</span><span style=
"color: inherit" class=
"keyword">(
</span><span style=
"color: inherit" class=
"default">$srlzd
</span><span style=
"color: inherit" class=
"keyword">,
</span><span style=
"color: inherit" class=
"default">$unsrlzr
</span><span style=
"color: inherit" class=
"keyword">));
<br><br></span><span style=
"color: inherit" class=
"comment">/*
<br> object(custom)#
10 (
1) {
<br> [
"data":
"custom":private]=
><br> array(
1) {
<br> [
"foo"]=
><br> string(
3)
"bar"<br> }
<br> }
<br><br>*/
<br><br></span><span style=
"color: inherit" class=
"default">?
><br></span>
118 </code></pre><h2 id=
"S-Expressions">S-Expressions
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#S-Expressions">#
</a>
119 </h2><p>An S-expression (or
<a href=
"https://en.wikipedia.org/wiki/S-expression">symbolic expression
</a>) is much like a list in that it’s an ordered collection of values. However, the notation aligns with Lisp syntax to connote use of application semantics like function calls or programming-language statements. As such, correct interpretation requires a higher-level context other than the raw Ion parser and data model.
</p><p>In the text format, S-expressions are bounded by parentheses. S-expressions also allow unquoted operator symbols (in addition to the unquoted identifier symbols allowed everywhere), so commas are interpreted as values rather than element separators.
</p><pre><code><span style=
"color: inherit" class=
"html">
120 null.sexp // A null S-expression value
<br>() // An empty expression value
<br>(cons
1 2) // S-expression of three values
<br>([hello][there]) // S-expression containing two lists
<br><br>(a+-b) ( 'a' '+-' 'b' ) // Equivalent; three symbols
<br>(a.b;) ( 'a' '.' 'b' ';') // Equivalent; four symbols
<br></span>
121 </code></pre><p>Although Ion S-expressions use a syntax similar to Lisp expressions, Ion does not define their interpretation or any semantics at all, beyond the pure sequence-of-values data model indicated above.
</p><hr><h2 id=
"Next.up">Next up
<a class=
"permalink" href=
"ion/:%20Tutorial/:4.%20Special%20Datatypes#Next.up">#
</a>
124 <a href=
"ion/:%20Tutorial/:5.%20Symbols,%20Tables%20and%20Catalogs">Symbols, Tables and Catalogs
</a>
127 <div class=
"comments">
128 <style>.giscus-frame {min-height:
16em;}
</style>
130 function giscus_load(button) {
131 let script = document.createElement(
"script");
132 script.setAttribute(
"data-repo", 'awesomized/ext-ion');
133 script.setAttribute(
"data-category", 'Comments on Docs');
134 script.setAttribute(
"data-repo-id", 'R_kgDOGfXEXw');
135 script.setAttribute(
"data-category-id", 'DIC_kwDOGfXEX84CBHuf');
136 script.setAttribute(
"data-mapping", 'og:title');
137 script.setAttribute(
"data-input-position", 'bottom');
138 script.setAttribute(
"data-reactions-enabled", false);
139 script.setAttribute(
"data-theme", 'light');
140 script.setAttribute(
"data-lang", 'en');
142 script.src =
"//giscus.app/client.js";
143 button.parentNode.replaceChild(script, button);
146 <button class=
"activator" onclick=
"giscus_load(this)">Show Comments from Github Discussions
</button>
153 <li><a href=
"https://github.com/m6w6/mdref">mdref-v3.0
155 <li><a href=
"LICENSE">© 2013-
2022 All rights reserved.
</a></li>
162 <script src=
"index.js" defer
></script>