Sections

Registry Component


概述

Phalcon\Registry is an object oriented array. It extends Phalcon\Collection but cannot be extended itself since all of its methods are declared final. It offers speed, as well as implementations of various PHP interfaces. These are:

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

Constructor

You can construct the object as any other object in PHP. However, the constructor accepts an optional array parameter, which will populate the object for you.

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

Reusing

You can also reuse the component, by repopulating it. Phalcon\Registry exposes the clear() and init() methods, which will clear and repopulate the internal array respectively,

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->count(); // 2

$data = [
    'year' => 1776,
];

$collection->clear();

$collection->init($data);

echo $collection->count(); // 1

Get

As mentioned above, Phalcon\Registry implements several interfaces, in order to make the component as flexible as possible. Retrieving data stored in an element can be done by using:

  • Property
  • __get()
  • array based get ($collection[$element])
  • offsetGet()
  • get()

最快的方式是使用属性语法:

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->year; // 1776

You can use __get($element) but it is not advisable as it is much slower than the property syntax. The same applies to offsetGet

echo $collection->__get('year');           // 1776
echo $collection['year'];                  // 1776
echo $collection->offsetGet('year');       // 1776
echo $collection->get('year', 1776, true); // 1776
public function get(string $element, mixed $defaultValue = null, bool $insensitive = true):  mixed

Using get() offers two extra parameters. When $defaultValue is defined in the call, if the element is not found, $defaultValue will be returned. 默认情况下$insensitive被设置为true,使得集合中的搜索不区分大小写。 Setting this value to false will make the search for the element case sensitive.

Get

As mentioned above, Phalcon\Registry implements several interfaces, in order to make the component as flexible as possible. Retrieving data stored in an element can be done by using:

  • Property
  • __get()
  • array based get ($collection[$element])
  • offsetGet()
  • get()

最快的方式是使用属性语法:

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->year; // 1776

You can use __get($element) but it is not advisable as it is much slower than the property syntax. The same applies to offsetGet

echo $collection->__get('year');           // 1776
echo $collection['year'];                  // 1776
echo $collection->offsetGet('year');       // 1776
echo $collection->get('year', 1776, true); // 1776
public function get(string $element, mixed $defaultValue = null, bool $insensitive = true):  mixed

Using get() offers two extra parameters. When $defaultValue is defined in the call, if the element is not found, $defaultValue will be returned. 默认情况下$insensitive被设置为true,使得集合中的搜索不区分大小写。 Setting this value to false will make the search for the element case sensitive.

Has

To check whether an element exists or not in the collection, you can use the following:

  • isset() on the property
  • __isset()
  • array based isset (isset($coollection[$element]))
  • offsetExists()
  • has()

最快的方式是使用属性语法:

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo isset($collection->year); // true

You can use __isset(element) but it is not advisable as it is much slower than the property syntax. The same applies to offsetExists

echo $collection->__isset('year');        // true
echo isset($collection['year']);          // true
echo $collection->offsetExists('year');   // true
echo $collection->has('year', true);      // true
public function has(string $element, bool $insensitive = true):  bool

Using has() offers an extra parameter. 默认情况下$insensitive被设置为true,使得集合中的搜索不区分大小写。 Setting this value to false will make the search for the element case sensitive.

echo $collection->has('YEAR', true);      // true
echo $collection->has('YEAR', false);     // false

Set

To set an element in the collection, you can use the following:

  • assign the value to the property
  • __set()
  • array based assignment
  • offsetSet()
  • set()

最快的方式是使用属性语法:

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
];

$collection = new Registry($data);

$collection->year = 1776;

You can use __set($element, $value) but it is not advisable as it is much slower than the property syntax. The same applies to offsetSet

$collection->__set('year', 1776);
$collection['year'] = 1776;
$collection->offsetSet('year', 1776);
$collection->set('year', 1776); 

Remove

To remove an element in the collection, you can use the following:

  • unset the property
  • __unset()
  • array based unset
  • offsetUnset()
  • remove()

最快的方式是使用属性语法:

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
];

$collection = new Registry($data);

unset($collection->year);

You can use __unset($element) but it is not advisable as it is much slower than the property syntax. The same applies to offsetUnset

$collection->__unset('year');
unset($collection['year']);
$collection->offsetUnset('year');
$collection->remove('year'); 
public function remove(string $element, bool $insensitive = true):  void

Using remove() offers an extra parameter. 默认情况下$insensitive被设置为true,使得集合中的搜索不区分大小写。 Setting this value to false will make the search for the element case sensitive.

$collection->remove('YEAR', true);
$collection->remove('YEAR', false);

Iteration

Since the collection object implements \IteratorAggregate, you can iterate through the object with ease. The method getIterator() returns an ArrayIterator() object

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

foreach ($collection as $key => $value) {
    echo $key . ' - ' . $value . PHP_EOL;
}

Count

The implementation of the \Countable interface exposes the count() method, which stores the number of elements in the collection.

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->count(); // 2

Serialization

The \Serializable and \JsonSerializable interfaces expose methods that allow you to serialize and unserialize the object. serialize() and unserialize() use PHP’s serialize and unserialize functions. jsonSerialize() returns an array which can be used with json_encode to serialize the object.

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->serialize();    // a:2:{s:6:"colors";a:3:{i:0;s:3:"red";i:1;s:5:"white";i:2;s:4:"blue";}s:4:"year";i:1776;}

$serialized = 'a:2:{s:6:"colors";a:3:{i:0;s:3:"red";i:1;s:5:"white";i:2;s:4:"blue";}s:4:"year";i:1776;}';
$collection->unserialize($serialized);

echo $collection->jsonSerialize(); // $data

Transformations

Phalcon\Registry also exposes two transformation methods: toArray() and toJson(int $options). toArray() returns the object transformed as an array. This method returns the same array as jsonSerialize().

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->toArray(); // $data

toJson(int $options) returns a JSON representation of the object. It uses json_encode internally and accepts a parameter, which represents the flags that json_encode accepts. By default the options are set up with the value 74, (RFC4327) which translates to:

  • JSON_HEX_TAG
  • JSON_HEX_APOS
  • JSON_HEX_AMP
  • JSON_HEX_QUOT
  • JSON_UNESCAPED_SLASHES

You can pass any valid flags to the method according to your needs.

<?php

use Phalcon\Registry;

$data = [
    'colors' => [
        'red',
        'white',
        'blue',
    ],
    'year'   => 1776,
];

$collection = new Registry($data);

echo $collection->toJson(); // ["red","white","blue"],"year":1776}

echo $collection->toJson(74 + JSON_PRETTY_PRINT);
/**
{
    "colors": [
        "red",
        "white",
        "blue"
    ],
    "year": 1776
}
*/