powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / multiobject
12 сообщений из 12, страница 1 из 1
multiobject
    #38251932
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, подскажите как избавиться от:
Warning: Creating default object from empty value in /...
Вот как я использую объектную модель:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?php

ini_set('display_errors', 1);

class A {

	public function __set($name, $value) {
		$this->$name = new stdClass();
	}
}
$A = new A();

$A->B->C->D = 'value';

print '<pre>';
print_r($A);
print '</pre>';
?>


В результате получаю:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Warning: Creating default object from empty value in ../..php on line 13

A Object
(
    [B] => stdClass Object
        (
            [C] => stdClass Object
                (
                    [D] => value
                )
        )
)



Отказаться от ошибок я не могу, так как у меня многое завязано на на обработчиках...

Спасибо!
...
Рейтинг: 0 / 0
multiobject
    #38251937
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так тоже работает:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php
ini_set('display_errors', 1);

class A {}
$A = new A();
$A->B->C->D = 'value';

print '<pre>';
print_r($A);
print '</pre>';
?>


точнее только так и работает.. я и с перезагрузкой баловался, ничего не получилось (
...
Рейтинг: 0 / 0
multiobject
    #38251970
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так ошибку не выводит:
Код: php
1.
2.
3.
4.
5.
6.
class A {}

$A = new A();
$A->B = (object) null;
$A->B->C = (object) null;
$A->B->C->D = 'value';


то есть надо как-то в классе перезагружать родительский объект
...
Рейтинг: 0 / 0
multiobject
    #38252087
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseous,

А php ругнётся, если написать $A->B->C = 'value' ?

P.S. просто интересно, а зачем такая запись могла потребоваться?
...
Рейтинг: 0 / 0
multiobject
    #38252108
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну например представьте что у вас есть класс setting,
его наследуют многие классы и вытягивают свою часть данных
естественно сам класс представляет собой не просто оболочку с переменными,
а модель динамической загрузки *.ini файлов с параметрами..
все данные между классами наследуются через protected

так вот возникла определять настройки не только по средствам наследования,
но из паблика тоже.. данные в паблике в виде массива,
который в свою очередь преобразуется в object

$A->B->C->D равен
Код: php
1.
2.
3.
4.
5.
6.
7.
$A = array(
	'B' => array(
		'C' => array(
			'D' => 'value'
		)
	)
);

проще говоря многомерный массив = многомерному объекту

Что касаемо ошибки, попробуйте вывести на экран:
Код: php
1.
2.
3.
4.
5.
6.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

$A->B = 'value';
?>
...
Рейтинг: 0 / 0
multiobject
    #38252114
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так предупреждения не будет:
Код: php
1.
2.
3.
4.
5.
<?php
ini_set('display_errors', 1);
$A = (object) null;
$A->B = 'value';
?>
...
Рейтинг: 0 / 0
multiobject
    #38252126
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно что:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<?php

ini_set('display_errors', 1);

/**
 * Так работает без предупреждения
 */
$A = (object) array(
	'B' => array(
		'C' => array(
			'D' => 'value'
		)
	)
);

print '<pre>';
print_r($A);
print '</pre>';

/**
 * Так нет
 */
$A->B->C->D->E = 'value';

print '<pre>';
print_r($A);
print '</pre>';
?>
...
Рейтинг: 0 / 0
multiobject
    #38252137
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseous,

скажу даже больше... для меня __set - это вообще в новизну, не приходилось ранее пользовать (знал, что такое есть, но обходился без этого). И вот я начал исследовать и... пришёл к выводу, что при $A->B->C = ... метод __set не вызывается.
Почему? - не знаю. Сам впервые столкнулся, просто помогаю понять проблему :)
...
Рейтинг: 0 / 0
multiobject
    #38252156
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseous,

И ещё одно, если я правильно понял, то всё что требуется - это многомерный массив перевести в многомерный объект?

тогда почему бы просто не запустить ту же рекурсию?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function arrayToObj(&$v){
  if (is_array($v)){
    foreach($v as &$arr){
      arrayToObj($arr);
    }
    $v = (object)$v;
  }
}
$o=array(
	1=>array(
		1=>'aaa',
		2=>'bbb'
	)
);
arrayToObj($o);
...
Рейтинг: 0 / 0
multiobject
    #38252186
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема в том что часть так и преобразуется, а вот другая часть во многих модулях
прописана объектной моделью

...
$setting->module1->param1->param2 = 'value';

или
$setting->module2->param1 = 'value';
$setting->module2->param2->param21 = 'value';
$setting->module2->param2->param22 = 'value';

и пр..
...
Рейтинг: 0 / 0
multiobject
    #38252190
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function arrayToObj(&$v){
  if (is_array($v)){
    foreach($v as &$arr){
      arrayToObj($arr);
    }
    $v = (object)$v;
  }
}
$o=array(
	1=>array(
		1=>'aaa',
		2=>'bbb'
	)
);
arrayToObj($o);



отличается от:
Код: php
1.
2.
3.
4.
5.
$o = (object) array(
	1=>array(
		1=>'aaa',
		2=>'bbb'
	)



с этим как раз нет проблем, тут ничего не ругается
...
Рейтинг: 0 / 0
multiobject
    #38252244
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseousа чем:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function arrayToObj(&$v){
  if (is_array($v)){
    foreach($v as &$arr){
      arrayToObj($arr);
    }
    $v = (object)$v;
  }
}
$o=array(
	1=>array(
		1=>'aaa',
		2=>'bbb'
	)
);
arrayToObj($o);



отличается от:
Код: php
1.
2.
3.
4.
5.
$o = (object) array(
	1=>array(
		1=>'aaa',
		2=>'bbb'
	)



с этим как раз нет проблем, тут ничего не ругается

отличается вот этим:

Код: php
1.
stdClass Object ( [1] => stdClass Object ( [1] => aaa [2] => bbb ) )



Код: php
1.
stdClass Object ( [1] => Array ( [1] => aaa [2] => bbb ) )
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / multiobject
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]