Jump to content

Classe Lista em PHP


Eddu

Recommended Posts

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);
}
}
?>
Link to comment
Share on other 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"

Link to comment
Share on other 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

Link to comment
Share on other 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.

Link to comment
Share on other 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

Link to comment
Share on other 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.

🙂

Link to comment
Share on other 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;
}
}
?>
Link to comment
Share on other 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.

Link to comment
Share on other 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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.