Ссылки на объекты

Rollton

Новичок
Ссылки на объекты

Здравствуйте, написал реализацию списков в пхп. Всё работает отлично, но только в пхп 5. Помогите если это возможно, чтобы заработало и пхп 4. Заранее спасибо.
Код:
PHP:
<?php
// класс для списка
class ListNode{
               var $Value;
               var $NextNode;
               var $SubNode;
}

$root = &addnode( $root, '5656' );
$r1 = &addnode( $root, '9595' );

addsub( $r1, '856');
$r2 = &addsub( $r1, 'GGGGG');

addsub( $r2, '123456');
addnode( $root, 'gggg' );

parse( $root, '=' );

// функция добавления в конец списка
function addnode( $root, $value ){
                if ( $root == NULL ) {
                                $root = new ListNode;
                                $root->Value = $value;
                                $root->NextNode = NULL;
                                $root->SubNode = NULL;
		
                                return $root;
                } else {
                                $curnode = $root;
                                while ( $curnode->NextNode != NULL ){
                                                $curnode = $curnode->NextNode;
                                }
                                $curnode->NextNode = new ListNode;
                                $curnode = $curnode->NextNode;
                                $curnode->Value = $value;
                                $curnode->NextNode = NULL;
                                $curnode->SubNode = NULL;	
		
                                return $curnode;
                }
}

// добавление дочерних элементов
function addsub( $root, $value ) {
                if ( $root->SubNode == NULL ) {
                                $root->SubNode = new ListNode();
                                $curnode = $root->SubNode;
                                $curnode->Value = $value;
                                $curnode->NextNode = NULL;
                                $curnode->SubNode = NULL;
                                return $curnode;
                } else {
                                $curnode = $root->SubNode;
                                while ( $curnode->NextNode != NULL ){
                                                $curnode = $curnode->NextNode;
                                }
                                $curnode->NextNode = new ListNode();
                                $curnode = $curnode->NextNode;
                                $curnode->Value = $value;
                                $curnode->NextNode = NULL;
                                $curnode->SubNode = NULL;	
		
                                return $curnode;
                }
}

// вывод дерева
function parse( $root, $space = '' ){
                $curnode = $root;
                while ( $curnode != NULL ) {
                                echo $space.$curnode->Value.'<br>';
                                if ( $curnode->SubNode != NULL ) {
                                                parse( $curnode->SubNode , $space.'====' );
                                }
                                $curnode = $curnode->NextNode;
                }
}

?>
 

moxnatiy

Новичок
передавай обьекты в функции по ссылке

function addsub( & $root, $value ) {
}
 

Rollton

Новичок
Тот же эффект, выводит только корневой элемент...
Может что то не так делаю?
PHP:
<?php
// класс для списка
class ListNode{
	var $Value;
	var $NextNode;
	var $SubNode;
}

$root = NULL;
$root = &addnode( $root, '5656' );
$r1 = &addnode( $root, '9595' );

addsub( $r1, '856');
$r2 = &addsub( $r1, 'GGGGG');

addsub( $r2, '123456');
addnode( $root, 'gggg' );

parse( $root, '=' );

// функция добавления в конец списка
function addnode( &$root, $value ){
	if ( $root == NULL ) {
		$root = new ListNode;
		$root->Value = $value;
		$root->NextNode = NULL;
		$root->SubNode = NULL;
		
		return $root;
	} else {
		$curnode = $root;
		while ( $curnode->NextNode != NULL ){
			$curnode = $curnode->NextNode;
		}
		$curnode->NextNode = new ListNode;
		$curnode = $curnode->NextNode;
		$curnode->Value = $value;
		$curnode->NextNode = NULL;
		$curnode->SubNode = NULL;	
		
		return $curnode;
	}
}

// добавление дочерних элементов
function addsub( &$root, $value ) {
	if ( $root->SubNode == NULL ) {
		$root->SubNode = new ListNode();
		$curnode = $root->SubNode;
		$curnode->Value = $value;
		$curnode->NextNode = NULL;
		$curnode->SubNode = NULL;
		return $curnode;
	} else {
		$curnode = $root->SubNode;
		while ( $curnode->NextNode != NULL ){
			$curnode = $curnode->NextNode;
		}
		$curnode->NextNode = new ListNode();
		$curnode = $curnode->NextNode;
		$curnode->Value = $value;
		$curnode->NextNode = NULL;
		$curnode->SubNode = NULL;	
		
		return $curnode;
	}
}

// вывод дерева
function parse( &$root, $space = '' ){
	$curnode = $root;
	while ( $curnode != NULL ) {
		echo $space.$curnode->Value.'<br>';
		if ( $curnode->SubNode != NULL ) {
			parse( $curnode->SubNode , $space.'====' );
		}
		$curnode = $curnode->NextNode;
	}
}

?>
 

McSimm

Новичок
moxnatiy
In recent versions of PHP you will get a warning saying that "Call-time pass-by-reference" is deprecated when you use a & in foo(&$a);

передачу по ссылке лучше декларировать в заголовке функции
 

Rollton

Новичок
при вызове пробовал тоже по сслке передавать, эффект одинаковый :'(
 

McSimm

Новичок
moxnatiy
Да, я знаю -- виноват, невнимательно сообщение прочел
 

Rollton

Новичок
Всем спасибо за ответы :) постю на всякий случай работающий вариант :)

PS: главную подсказку дали на сайте rsdn.ru :)))))

PHP:
<?php
// класс для списка
class ListNode{
	var $Value;
	var $NextNode;
	var $SubNode;
}

$root = NULL;
addnode( $root, '5656' );

$r1 = &addnode( $root, '9595' );

addsub( $r1, '856');
$r2 = &addsub( $r1, 'GGGGG');

addsub( $r2, '123456');
addnode( $root, 'gggg' );

parse( $root, '=' );
//var_dump( $root );
// функция добавления в конец списка
function &addnode( &$root, $value ){
	if ( $root == NULL ) {
		$root = new ListNode();
		$root->Value = $value;
		$root->NextNode = NULL;
		$root->SubNode = NULL;
		
		return $root;
	} else {
		$curnode = &$root;
		while ( $curnode->NextNode != NULL ){
			$curnode = &$curnode->NextNode;
		}
		$curnode->NextNode = new ListNode();
		$curnode = &$curnode->NextNode;
		$curnode->Value = $value;
		$curnode->NextNode = NULL;
		$curnode->SubNode = NULL;	
		
		return $curnode;
	}
}

// добавление дочерних элементов
function &addsub( &$root, $value ) {
	if ( $root->SubNode == NULL ) {
		$root->SubNode = new ListNode();
		$curnode = &$root->SubNode;
		$curnode->Value = $value;
		$curnode->NextNode = NULL;
		$curnode->SubNode = NULL;
		return $curnode;
	} else {
		$curnode = &$root->SubNode;
		while ( $curnode->NextNode != NULL ){
			$curnode = &$curnode->NextNode;
		}
		$curnode->NextNode = new ListNode();
		$curnode = &$curnode->NextNode;
		$curnode->Value = $value;
		$curnode->NextNode = NULL;
		$curnode->SubNode = NULL;	
		
		return $curnode;
	}
}

// вывод дерева
function parse( &$root, $space = '' ){
	$curnode = $root;
	while ( $curnode != NULL ) {
		echo $space.$curnode->Value.'<br>';
		if ( $curnode->SubNode != NULL ) {
			parse( $curnode->SubNode , $space.'====' );
		}
		$curnode = $curnode->NextNode;
	}
}
?>
 
Сверху