Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Manoel Barros

Forçar tipagem em PHP

Recommended Posts

Ola pessoal

Galera tava pensando neste problema de forçar tipagem em php, por que a momentos que você precisa que uma array tenha uma coleção de dados de um tipo só. então fiz essas classes, para que de alguma forma forçe a tipagem, coisas que somente linguagens fortemente tipadas como java nos fornece.

Uma classe String, que guardará valores somente do tipo String:

class String {
	
	private $value;
	
	public function __construct( $value ) {
		$this->set( $value );
	}

	public function set( $value ) {
		$this->value = (string) $value; // converte para string
	}

	public function get() {
		return $this->value;
	}
        
        // Compara se o valor do parâmetro é igual ao da instância da classe String
	public function isEqual( String $string ) {
		return $this->value === $string->get();
	}

	public function __toString() {
		return $this->value;
	}

} 

Agora uma Classe arrayString que aceita valores somente do tipo string:

class ArrayString extends ArrayObject { 

    public function __construct($array){
        foreach ($array as $v) {
            if ( !$v instanceOf String ) 
                throw new Exception("valor nao string dentro dessa array");
        }
        parent::__construct($array, ArrayObject::ARRAY_AS_PROPS);
    }

    public function offsetSet($index, $val) {
    	if ( !$val instanceOf String )
    		throw new Exception("Essa array so aceita valores do tipo string");
    	parent::offsetSet($index, $val);
    }

} 

Agora testando essas classes:

$String = new String('texto ');

$ArrayString = new ArrayString( array( $String, $String ) );
$ArrayString['valor'] = $String;
//$ArrayString['outroValor'] = new Int(8); // vai dá um erro

var_dump($ArrayString);

E ae pessoal, to viajando na maionese, ou fazendo isso pode resolver o problema de tipagem,

E outra coisa, já que para cada dado terá a sua classes especifica, isso poderá deixar o sistema mais lento ? pq terá varias instâncias de cada tipo de dado..

 

Opiniões, sugestões e correções serão muito bem vindos, desde já obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para o PHP 5 PHP::SPL Types, Para o PHP 7 já existe esse tipo de tipagem.

 

Para a tipagem de listas/coleções, eu fiz um artigo sobre isso: http://forum.imasters.com.br/topic/537066-tutorial-integridade-de-colecoes-com-uso-de-iterator/

 

Outro ponto, é a granularidade. Se a tipagem de tipos scalares é um problema, não há o porque não utilizar. Mas se não for um problema, só vai aumentar a quantidade de classes que sua aplicação terá de gerenciar. E é fato que quanto maior a granularidade de classes, mais lenta é a aplicação.

 

Nesse caso, eu sugiro estudar sobre object calisthenics, um dos tópicos é sobre tipos primitivos. De uma lida nesse e nesse. São do mesmo autor, mas há detalhes que está em um e não no outro.

 

Existe, também, uma função que utiliza o sistema de erros do PHP e valida o Type Hint, mas ela é lenta: http://php.net/manual/en/language.oop5.typehinting.php#83442

 

Existe uma otimizada, mas continua sendo lenta:

http://php.net/manual/en/language.oop5.typehinting.php#111411

 

Sobre a tipagem em si, eu gostaria que pudesse ser de tipagem forte, já quis escrever minhas próprias classes, mas não o fiz. Pois o PHP como está hoje, resolve meus problemas. O que eu preciso de uma integridade maior, encapsulo conforme o seu escopo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.