• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Eddu

Classe Lista em PHP

16 mensagens neste tópico

Boas Pessoal, para quem já trabalhou em java, e passou por algum motivo para php, decerto que sentiu uma comechãozinha por php não ter a sua linguagem nativa orientada a objectos, uma díficil adatptação aos arrays.

o que eu pensei, foi aprender os arrays em php, mas criar uma classe que se assemelhe ao que já existe no java, por exemplo:

DefaultListModel, Vector, ArrayList, etc...

gostava de perguntar se algum de vocês conhece uma classe destas já iimplementada, vou dexar um poco de codigo do que comecei á 10 min a fazer, para melhor perceberem aquilo que prentendo.

obrigado, Carlos Correia

CODIGO:

<?php
class DefaultArray{
protected $array;


function __construct(){
	$this->array = array();
}

function addElement($element){
	$this->array[]=$element;
}

function getElementAt($index){

	if(isset($this->array[$index]))
		return $this->array[$index];
	else 
		return "ERROR: POSITION NOT FOUND: ".$index;
}

function getFirst(){
	if (isset($this->array[0]))
		return $this->array[0];
	else 
		 return "ERROR: POSITION NOT FOUND: ".$index;
}

function getLast(){
	$last_position=count($this->array)-1;
	if (isset($this->array[$last_position]))
		return $this->array[$last_position];
	else 
		 return "ERROR: POSITION NOT FOUND: ".$index;
}

function getSize(){
	return count($this->array);
}
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes escolher a chave a atribuir a um valor numa DefaultArray em Java? Se sim, tens isso mal implementado na getFirst() só para começar. :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva,

Eu pessoalmente acho um mau uso de recursos estares a encapsular as funções de array do php num classe, sem lhes trazeres valor acrescentado.

Para alem de reduzires a performance não estás a ter mais valia nenhuma e perdes tempo a "reinventar a roda"

percebo que para quem vem do java o php possa ser confuso, mas acho que tens muito a ganhar em compreender a forma de funcionamento e lógica do php em vez de o tentar tornar num "java for web"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas Sven, cada um tem a sua maneira de programar, e cada um tem o seu gosto por determinados aspectos.

em relação ao php, tem algumas coisas que gosto, outras que nem tanto

exemplo: em várias linguagens que não php, tens sempre a hipotese de ter arrays ou então listas, sendo as últimas muito mais dinamicas e melhoram o trabalho um codigo mais complexo.

o php só contem arrays, o que será útil, com alguma maquiagem, transformar uma linguagem não orientada a objectos para uma classe orientada a objectos.

Caso tenhas passado pela faculdade, existem várias cadeiras que te ensinam a fazer este tipo de coisas, para teres código reutilizável e simples de usar, o que com outro tipo de comandos sería mais complexo.

Abraço

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eddu, php tem suporte completo para programação orientada a objectos. Não é o uso do operador de acesso '.' que determina o que é uma lingagem orientada a objectos.

O php os arrays têm ponteiro internos que pode ser percorridos por loops foreach por exemplo.

foreach($array as $elemento){
// yeah baby
}

Para alem disso são multidimensionais e associativos. Não estou ver que grande vantagem traga uma classe para uso de arrays, basicamente vais estar a embrulhar não sei quantas funções noutros tantos métodos de uma classe.

Se quiseres uma lista ligada ou suplamente ligada... sí sim, uma classe pode dar jeito, agora para arrays, na minha opiniao é reinventar a roda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

certo pessoal, como ja disse, o que estou a fazer é apenas maquiar o que o php tem, e por doutra forma, é sabido que ira degradar um poco a performance, mas isso envolve mais uns saltos no program counter, o que nao trará muita degradação, se tivermos em conta que um processador de 3.0Ghz, executa 3 milhoes de calculos por segundo, um jump de uma função para outra, envolve umas modificações no program counter (2 ou 3 calculos).

sinceramente irá dar-me jeito, para ter o meu codigo mais legível, gosto de conseguir reutiilizar codigo, e nao programar caso a caso, estou então a criar várias classes que me podem ser úteis na criação de sites orientados a Objectos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tá-se bem, mas não me respondeste a isto:

Podes escolher a chave a atribuir a um valor numa DefaultArray em Java?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu percebo perfeitamente a tua intençao de fazer isso.

Foi lançado com o PHP5 algumas interfaces (http://devzone.zend.com/article/2565-The-Standard-PHP-Library-SPL), que permitem dar alguma abstração ao código (as-in ensinado em Java).

Aspectos que melhorava na tua class seria:

- Usar exceptions em vez de retornar mensagens de erro.

- No getFirst e getLast usar o reset() e end() para retoranr primeiro e ultimo valor dum array

- Mudar o nome da class.

- "parametrizar" a class (fazer uma especie de emulaçao). Pedir um tipo no constructor e exigi-lo aquando da inserção de elementos.

- Criar interfaces de ordenaçao, para que as pessoas implementassem comparable e comparator e a classe geria essa ordenaçao.

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja posto aqui a versao semi final que ando a testar, depois criticam e sugerem alterações como fez o Mx+

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
<?php
/**
***************************
* Author:  Carlos Correia *
* Version: 0.1            *
* Date:    06/11/2007     *
***************************
*/
class DefaultArray{
protected $array;

/**
 * Construct an empty array
 */
function __construct(){
	$this->array = array();
}

/**
 * Add an element to the end of array
 * @param object $element
 */
function addLast($element){
	$this->array[]=$element;
}

/**
 * Add an element to the begin of array
 * @param object $element
 */
function addFirst($element){
	array_unshift($this->array,$element);
}

/**
 * Add element in array into position 
 * indicate by the index argument
 * @param int $index
 * @param object $element
 */
function addElementAt($index,$element){
	if($index>=0 and $index<=count($this->array))
		array_splice($this->array,$index,0,$element);
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		if($index<0)
			throw new Exception('INDEX IS NEGATIVE');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * replace an element in array into position indicate
 *  by the index argument
 * @param int $index
 * @param object $element
 */
function setElementAt($index,$element){
	if (isset($this->array[$index])) {
		$this->array[$index]=$element;
	}
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		if($index<0)
			throw new Exception('INDEX IS NEGATIVE');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * Return an element in array, indicate by the
 * index argument
 * @param int $index
 * @return object
 */
function getElementAt($index){

	if(isset($this->array[$index]))
		return $this->array[$index];
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		if($index<0)
			throw new Exception('INDEX IS NEGATIVE');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * Return the first element in array
 * @return object
 */
function getFirst(){
	if (isset($this->array[0]))
		return $this->array[0];
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * return the last element in array
 * @return object
 */
function getLast(){
	$last_position=count($this->array)-1;
	if (isset($this->array[$last_position]))
		return $this->array[$last_position];
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		else
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * Remove the first element in array
 * @return object
 */
function removeFirst(){
	if (isset($this->array[0])) 
		return array_shift($this->array);
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * Remove the last element in aray
 * @return object
 */
function removeLast(){
	$last_position=count($this->array)-1;
	if ($last_position>=0)
		return array_pop($this->array);

	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}
}

/**
 * Remove an element in position indicate by 
 * the index argument
 * @param int $index
 * @return removed element
 */
function removeElementAt($index){
	if(isset($this->array[$index])){
		$removed = array_splice($this->array,$index,1);
		return $removed[0];
	}
	else try {
		if(count($this->array)==0)	
			throw new Exception('EMPTY ARRAY');
		if($index<0)
			throw new Exception('INDEX IS NEGATIVE');
		else 
			throw new Exception('POSITION NOT FOUND');
		}catch (Exception $e){echo $e; exit;}	
}

/**
 * Append currente array with other array
 * given by argument
 * @param DefaultArray or Array
 */
function appendArray($array){
	if (is_a($array,'DefaultArray')) 
		$this->array=array_merge($this->array,$array->getArray());
	elseif(is_array($array))
		$this->array=array_merge($this->array,$array);
	else try {
		throw new Exception('ARGUMENT IS INVALID');
	}catch (Exception $e){echo $e; exit;}
}

/**
 * @return int size of array
 */
function getSize(){
	return count($this->array);
}

/**
 * write a tree of values in array
 * @return string
 */
function toString(){
	return var_export($this->array,true);
}

/**
 * Return array
 * @return array
 */
function getArray(){
	return $this->array;
}
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal, nao liguem ao meu inglês, é mesmo o meu inglês :( mais ninguem percebe.

Essa é a versão que ando a testar, ainda nao encontrei bug's assinaláveis.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No toString(), tens a certeza que não queres é o serialize()?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um ponteiro, ou outro tipo de referencia tipo um índice numérico para um elemento pode ser pratico para quando se pretende percorrer a lista sem ser toda de uma vez.

É uma coisa que podes adicionar... se entenderes claro.

Bem cool esse código.

Afixa aí umas linhas de código exemplo para o pessal ver o potencial desta classe. Temos um wiki na calha, isto é uma boa classe para lá por.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa importante, as excepções quando as lanças não é para serem apanhadas dentro da própria função ; ) Deixa as excepções sairém em paz : D

Se não te importares vou implementar o iterable.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas Mx+, em relação as exepções, neste caso tive que implementar na função, porque nao fazia sentido cada vez que utilizasse a função, ter que fazer um try catch.e assim se houver algum problema na chamada á função, o programador vê logo o que se está a passar, emr elação as implementações, implementem mais, ou alterem, e de seguida postem aqui, para todos podemros ver..

abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora