Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
Não sabia dá existência SPL Types, obrigado pela dicas !
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 nessee 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.