ООП: видимость дочерних параметров в родительском классе

vadim

Guest
ООП: видимость дочерних параметров в родительском классе

Есть два класса: родителський (Р) и дочерний (S).
Я написал функцию, которая обнуляет (то есть ставит NULL) все параметры класса
Что то типа того:
PHP:
function set_class_members_to_null()
{
$members=get_class_vars(get_class($this));
foreach($members as $k=>$v)
{
$this->$k=NULL;
}
}
Данная функция мне нужна только в дочернем классе
Все параметры типа protected

Так вот что меня беспокоит: если функция декларирована в дочернем классе, то всё работает, но если же в родительском, то ничего не происходит(и ошибок тоже нет). По идеи, если я вызываю функцию, которая наследуется от родителя, в дочернем классе, то она должна работать для дочернего класса (мои другие функции работают). А здесь как то не идёт: я наверно чтото пропустил или не понимаю

Возможно проблема в get_class_vars, она путается какой класс я имею в виду??
 

vadim

Guest
Frol
Не трудно, уже всё проверял. get_class_vars вообще ничего не отдаёт
Могу запостить пример кода, что я имею в виду, когда работает и когда не работает (там немного)
 

Frol

Новичок
немного?
вот и разбирай его.
моя ссылка тебе поможет.
 

vadim

Guest
Frol
Я уже всё проверил и что там написано-прекрасно знаю. В моей программе не баг, а видимо моё непонимание каких то принципов наследования, которые в моём случае вступают в роль. Вот я и хочу понять в чём я не прав


.des.
эта функция отдаёт установленные параметры(то есть которые на empty 0 отвечают), а мне надо по всем пройтись
 

kvf77

Red Devil
vadim

а версия PHP какая? применины ли какието ключевые слова при определении переменных (php5 - privete. public, protected)?
 

crocodile2u

http://vbolshov.org.ru
Можно вопрос к vadim...
Зачем такая функция понадобилась? Просто интересно...
 

vadim

Guest
Какая версия-точно не помню, так как на работе, где то между 5.0 и 5.1
kvf77
да, я написал выше, что везде protected
crocodile2u
Честно говоря она мне больше не нужна :) просто я делал функцию для сортировки массива с объектами по любому параметру класса (независимо от того, как переменная этого параметра называется), и на пути к этому написал эту проблемную функцию, а сейчас просто интересно, почему не работает
Такая функция может понадобится например для реинитиализации объекта, поставив всем параметрам какоето стандартное значение

Вот код с моей проблемой:
PHP:
class P
{
protected $id;

function set_class_members_to_null()
{
	$members=get_class_vars(get_class($this));
	var_dump($members);
	foreach($members as $k=>$v)
	{
		$this->$k=5;
	}
}

	
}


class S extends P
{
protected $name;
protected $time;
	
}

$s=new S();
$s->set_class_members_to_null();
var_dump($s);
 

.des.

Поставил пиво кому надо ;-)
Еще раз повторяю. [m]get_object_vars[/m]($this);
Код:
array(3) {
  ["name"]=>
  NULL
  ["time"]=>
  NULL
  ["id"]=>
  NULL
}
object(S)#1 (3) {
  ["name:protected"]=>
  int(5)
  ["time:protected"]=>
  int(5)
  ["id:protected"]=>
  int(5)
}
 

vadim

Guest
.des.
Я немного подумал и понял, что вы правы.

Меня сбил с толка немецкий перевод мануала, которым я пользуюсь. Ещё раз убеждаюсь, что такую литературу надо читать в оригинале.
Значит, вот, что стоит в английской версии и было не так описано в немецкой:
get_class_vars возвращает все параметры класса, но только для public элементов, но так как у меня все элементы protected, поэтому видимо происходит глюк (хотя функцию то я всё равно вызываю из дочернего класса....ну да ладно).

Что касается get_object_vars, так это функция до версии 4.2.0 возвращала не все параметры, а то те, у которых уже есть какое то значение, но в версиях выше она возвращает всё. Вот этой пометки насчёт разницы в версиях нет в немецком переводе, поэтому я и не хотел сначало использовать данныую функцию
 

.des.

Поставил пиво кому надо ;-)
насчет доступа сравните результат вывода
get_object_vars($s);
и get_object_vars($this) в методе класса
 
Сверху