MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
PHP5: Пример реализации класса, к которому возможен доступ как к массиву (на основе ArrayObject)
14.04.2017
19:44
Текстовые метки: PHP, PHP5, ArrayAccess, ArrayObject, SPL, скобки
Раздел: Компьютер - Программирование - Язык PHP

Пример реализации класса, который содержит некий массив.

К объекту этого класса можно осуществлять доступ через скобочный синтаксис.

При доступе через скобочный синтаксис, класс выдает значения из своего внутреннего массива.

Так же работает итерирование через foreach.


После реализации класса дано несколько примеров использования.


class MyArrayObject extends ArrayObject

{


protected $array = array();


public function __construct($array = array())

{

foreach ((array) $array as $key => $value) {

if (is_array($value)) {

$this->array[$key] = new self($value);

} else {

$this->array[$key] = $value;

}

}

}


public function offsetGet($key)

{

if (array_key_exists($key, $this->array)) {

return $this->array[$key];

}

}


public function offsetSet($key, $value)

{

if ($key) {

$this->array[$key] = $value;

} else {

$this->array[] = $value;

}

}


public function offsetUnset($key)

{

if (array_key_exists($key, $this->array)) {

unset($this->array[$key]);

}

}


public function offsetExists($key)

{

return array_key_exists($key, $this->array);

}


public function append($value)

{

$this->array[] = $value;

}


public function count()

{

return count($this->array);

}


public function getIterator()

{

return new ArrayIterator($this->array);

}


// Equivalent of array_key_exists()

public function arrayKeyExists($key)

{

return $this->offsetExists($key);

}

// Equivalent of in_array()

public function inArray($value)

{

return in_array($value, $this->array);

}

function __toString()

{

return 'Array';

}

}


// Примеры использования


$array = new MyArrayObject(

array(

'test',

'test1' => array(0,1,2,3, 'name'=>'value'),

2,

'test4' => 'test2 value'

)

);

$array[] = 'test2222';

echo $array[0] . '<hr/>';

echo $array['test4'] . '<hr/>';

var_dump($array);


echo "\nForeach support:\n";

foreach($array as $key=>$value) {

echo "Key ".$key.' : '.$value."\n";

}


echo "\nBracket access support:\n";

echo $array['test1'][1]."\n";

echo $array['test1']['name']."\n";



echo "\nArray key exists support:\n";

echo var_dump( array_key_exists(1, $array) )."\n"; // false

echo var_dump( array_key_exists('test1', $array) )."\n"; // false

// echo var_dump( in_array('test2 value', $array) )."\n"; // Show warnibg


echo var_dump( $array->arrayKeyExists('test1') )."\n"; // true

echo var_dump( $array->inArray('test2 value') )."\n"; // true


echo "\n";


Здесь показано, что существуют проблемы с функциями array_key_exists() и in_array(). Это известные проблемы, и вместо них можно использовать самописные методы arrayKeyExists() и inArray() самого класса.


Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования