Ir para conteúdo

POWERED BY:

Arquivado

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

Robson Silva

Cast de objetos

Recommended Posts

Alguém sabe como eu faço para fazer um casting de objetos (mudar o tipo dele).

 

Ex:

class Modulo
{
	var $id;
	var $nome;
	var $link;
	var $icone;
}

class Object
{
	var $id;
	var $nome;
	var $link;
	var $icone;
}

$object = new Object();
$object->id    = 1;
$object->nome  = 'Produtos';
$object->link  = 'http://www.site.com.br';
$object->icone = 'icone.gif';

No C# e no Java eu faria

$object = (Modulo)$object;

 

Como eu faço no php já que só existe cast de tipos primitivos?

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa pessoal ta difícil...

Vcs programam orientado a objetos e não sabem fazer cast de objetos no php??

 

Se não precisaram acho melhor ir aprendendo, porque é importante saber.

 

Não tem como fazer cast, não é nativo do php.

Se alguem precisar pode usar essa função, que é a melhor que existe por ai.

 

você passa o objeto e o nome da classe que deseja fazer o cast

 

        public static function typeCast($object, $newclass)
	{
	    if( !is_object($object) )
	    {
	        trigger_error('cast_class expects parameter 1 to be object, ' . gettype($object) . ' given', E_USER_WARNING);
	        return false;
	    }
	    if( !class_exists($newclass) )
	    {
	        // We'll save unserialize the work of triggering an error if the class does not exist
	        trigger_error('Class ' . $newclass . ' not found', E_USER_ERROR);
	        return false;
	    }
	    $serialized_parts = explode(':', serialize($object));
	    $serialized_parts[1] = strlen($newclass);
	    $serialized_parts[2] = '"' . $newclass . '"';
	    return unserialize(implode(':', $serialized_parts));
	}

abraços!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vcs programam orientado a objetos e não sabem fazer cast de objetos no php??

Se alguem precisar pode usar essa função, que é a melhor que existe por ai.

 

Hummm, lamento dizer amigo, mas isso é uma tremenda gambiarra.

 

Se por algum motivo (que não seja erro de projeto) você tiver um objeto antigo de uma interface qualquer e precisa utilizá-lo em um outro objeto que espera uma outra interface incompatível, você deve utilizar um padrão de projeto chamado Adapter:

 

Imagina o seguinte:

 

ITarget.php

<?php
interface ITarget {
public function show();
}

 

Target.php

class Target implements ITarget {
public function show(){
	echo __CLASS__ , '::' , __METHOD__ , '();' , PHP_EOL;
}
}

 

E seu cliente:

Client.php

class Client {
public function draw( IAdaptee $adaptee ){
	$adaptee->draw();
}
}

 

Como pode ver, seu Client espera um IAdaptee e você tem um ITarget:

IAdaptee.php

interface IAdaptee {
public function draw();
}

 

Adaptee.php

class Adaptee implements IAdaptee {
public function draw(){
	echo __CLASS__ , '::' , __METHOD__ , '();' , PHP_EOL;
}
}

 

Se você tentar utilizar seu ITarget no seu Client:

$target = new Target();

$client = new Client();
$client->draw( $target );

 

Você receberá a seguinte mensagem:

Catchable fatal error: Argument 1 passed to Client::draw() must implement interface IAdaptee, instance of Target given

 

Bom, você ainda precisa usar o ITarget no seu Client, para isso você utiliza um Adapter:

IAdapter.php

interface IAdapter extends ITarget, IAdaptee {}

 

Adapter.php

class Adapter implements IAdapter {
private $target;

public function __construct( ITarget $target ){
	$this->target =& $target;
}

public function show(){
	return $this->target->show();
}

public function draw(){
	return $this->show();
}
}

 

Agora seu Client poderá usar seu objeto antigo:

$target = new Target();
$adapter = new Adapter( $target );

$client = new Client();
$client->draw( $adapter );

 

A saída será:

Target::Target::show();

 

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.