Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public function &__get($name)
{
if (is_scalar($this->data[$name]))
{
$property = $this->data[$name];
}
else
{
$property = &$this->data[$name];
}
return $property;
}$my->x = 1; $x = &$my->x; $x = 0;
__get. Например, для определённых типов клонировать объект и возвращать ссылку на копию.return &$this->data[$name];PHP — быдло язык!как бы намекает на некий холивар.
protected $data = array('some' => array('sub' => 'data'));$my = new MyClass(array('some' => array('sub' => 'data')));class ParameterHolder
{
private
$parameters = array();
public function __set($name, $value)
{
$this->parameters[$name] = $value;
}
public function & __get($name)
{
if (array_key_exists($name, $this->parameters))
{
$value = & $this->parameters[$name];
}
return $value;
}
}
// Применение
$parameters = new ParameterHolder();
$parameters->a1 = new ParameterHolder();
$parameters->a2 = new ParameterHolder();
$parameters->a2->b2 = new ParameterHolder();
$parameters->a1->b1 = 'variable1'; // variable1
$parameters->a2->b2->c2 = 'variable2'; // variable2
* This source code was highlighted with Source Code Highlighter.
class MyClass
{
protected $data = array('some' => array('sub' => 'data'));
public function __set($name, $value)
{
$this->data[$name] = $value;
}
public functio
if (is_scan &__get($name)
{lar($this->data[$name]))
{
$property = $this->data[$name];
}
else
{
$property = &$this->data[$name];
}
return $property;
}
}
$my = new MyClass();
$my->a1 = new stdClass();
$my->a1->b2 = new stdClass();
$my->a1->b1 = 'variable1';
$my->a1->b2->c2 = 'variable2';
var_dump($my->a1->b1, $my->a1->b2->c2);
/*
string(9) "variable1"
string(9) "variable2"
*/
$my->a1->b1 = 'variable1';.public functio
if (is_scan &__get($name)
{lar($this->data[$name]))
_get описан в комментарии ниже habrahabr.ru/blogs/php/103834/#comment_3233735
class MyClass
{
protected $data = array('some' => array('sub' => 'data'));
public function __set($name, $value)
{
$this->data[$name] = $value;
}
public function &__get($name)
{
if (is_scalar($this->data[$name]))
{
$property = $this->data[$name];
}
else
{
$property = &$this->data[$name];
}
return $property;
}
}
$my = new MyClass();
$my->some['x']['y']['z'] = 'foo';
var_dump($my->some);
/*
array(2) {
["sub"]=>
string(4) "data"
["x"]=>
array(1) {
["y"]=>
array(1) {
["z"]=>
string(3) "foo"
}
}
}
*/
$my->something_else = array();
$my->something_else['a']['b']['c'] = 'bar';
var_dump($my->something_else);
/*
array(1) {
["a"]=>
array(1) {
["b"]=>
array(1) {
["c"]=>
string(3) "bar"
}
}
}
*/
__get реализовать так:
public function &__get($name)
{
return $this->data[$name];
}
// Определяем скалярный член $my->scalar = 1; // Так, конечно, ничего не будет $scalar = $my->scalar; $scalar = 0; var_dump($scalar, $my->scalar); /* int (0) int (1) */ // А вот так можно будет поменять значение скалярного члена класса $scalar = &$my->scalar; $scalar = 0; var_dump($scalar, $my->scalar); /* int (0) int (0) */
is_scalar тут лишняя — её нужно заменить на is_array.$array = array('some' => array('sub' => 'data'),
'b' => 'two',
'c' => 'three');
$arrayObject = new ArrayObject($array, ArrayObject::ARRAY_AS_PROPS);
$arrayObject->some['sub'] = 'test';
print_r($arrayObject);
ArrayObject Object
(
[some] => Array
(
[sub] => test
)
[b] => two
[c] => three
)
Вложенные массивы и Magic Methods