Conversão para tipos específicos em PHP

O PHP não requer a definição de tipos explícita, mas em alguns momentos pode ser conveniente fixar um tipo. Para isso o PHP tem um conjunto de tipos nativos e uma forma de fazer a conversão. Mas isso vale apenas para tipos nativos, não funciona com outros tipos, como um definido por uma classe.

$num = '1.53';
$num = (integer) $num;

Conversor Alternativo

function cast($arr, $class_name, $construct=false) {
	$obj = unserialize('O:'. strlen($class_name) .':"'. $class_name .'"'. substr(serialize($arr), 1));
	if ($construct && method_exists($obj, '__construct'))
		$obj->__construct();
	return $obj;
}

O truque é gerar uma representação armazenável de um valor (serialize mixed -> string) e depois manipular essa string para parecer que foi gerada pelo ponto que queremos e então transformar de volta em valor (unserialize).

O resultado é:

class MyType {
	function getLabel() {return $this->name;}
}

$data = ['name' => 'Serialize trick', 'works' => true];
$asMyTypeInstance = cast($data, 'MyType');

$asMyTypeInstance->getLabel();
// Serialize trick

Esse cast alternativo é de grande ajuda quando lidamos com formulários. Defina numa classe as propriedades requeridas e esqueça a validações isset/empty e a transposição de valores.

class ContactForm {
	public $name;
	public $text;
}

$form = cast($_POST, 'ContactForm');
$form->name;

You may also like...