Jump to content
Hipnoted

Fazer o cast de um objecto

Recommended Posts

Hipnoted

Boas, neste momento possuo uma aplicação que envia um VO do cliente para o servidor. O servidor, em PHP, recebe o objecto e depois eu quero fazer o cast com o VO definido no servidor.

Estou a tentar da seguinte forma mas dá erro:

/**
 * Add new user
 */
function addUser($data)
{
	$userVO = (UserVO) $data["userVO"];

O erro que dá é o:

PHP Parse error:  syntax error, unexpected T_STRING in /path/UserFxService.php on line 157

Alguém me sabe dizer como fazer o cast para uma classe (VO)?

*EDIT* Já agora, a minha classe UserVO é algo do género:

class UserVO
{
var $id_user;
var $name_user;
var $username;
var $password;


"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Share this post


Link to post
Share on other sites
scorch

Não me parece se PHP dê para fazer objectos, pelo menos na versão 5, pelo que acho que na versão 6 será possível.

No entanto podes sempre usar as seguintes funções:

http://pt.php.net/manual/pt_BR/function.get-class.php

http://pt.php.net/manual/pt_BR/function.is-subclass-of.php

http://pt.php.net/manual/pt_BR/function.get-parent-class.php

No PHP 5, o recomendado será mesmo usar:

http://pt.php.net/manual/pt_BR/language.operators.type.php

Pressuponho que esse cast seria para ter a certeza que a variável era a instância desse objecto, pelo que as funções acima funcionam. :thumbsup:


PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Penso que não é possível converteres para um objecto criado por ti. O máximo que podes fazer é criar um objecto genérico (stdClass) ou criares um método para converter um array em um objecto.

Share this post


Link to post
Share on other sites
taviroquai

Viva!

Ve lá se isto te serve...

class VO {
    public function __construct() {}
    public function import($array) {
        foreach($array as $attr => $value) $this->$attr = $value;
    }
}

$vo = new VO();
$vo->import($_GET);
var_dump($vo);

Share this post


Link to post
Share on other sites
yoda

Acho que ainda ninguém aqui percebeu o que ele perguntou.

@Hipnoted,

Que eu saiba, e pelo que procurei no manual, não dá para fazer casts em runtime. Ou seja, só podes usar aqueles que veem com a tua versão / pack. Podes no entanto, para o teu caso, fazer :

$userVO = (object) $data["userVO"];

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Ola Hipnoted,

Segundo o que eu percebi, fazes uma passagem de um objecto de um cliente para o servidor certo? O ideal seria fazeres o serialize do objecto ANTES de enviares para o servidor. Já no servidor, fazes o unserialize.

O problema do PHP é que inicia as variáveis superglobais antes das classes autoload. Portanto, mesmo que a tua class VO estivesse como autoload, o $_POST, $_GET, $_SESSION, etc... inicia antes e não reconhece o tipo de dados.

O serialize já te permite essa passagem. Eis um teste que fiz:

session_start();
class MyTest
{
  public $variable = "";
  public $changed = 0;
  
  function __construct()
  {
    $this->variable = "yeah!";
  }
  
  public function changeVariable()
  {
    $this->changed++;
    $this->variable = "changed {$this->changed} times!";
  }
}
if( !isset($_SESSION['object']) )
  $_SESSION['object'] = serialize(new MyTest());
else
{
  $object = unserialize($_SESSION['object']);
  $object->changeVariable();
  $_SESSION['object'] = serialize($object);
  var_dump($object);
}

Share this post


Link to post
Share on other sites
Hipnoted

Boas,

Essa questão não se coloca porque o cliente está em Flash (Flex), e para comunicar com o servidor uso o AMFPHP, que serializa automaticamente os objectos, abstraindo-me eu dessa tarefa. Seja como for obrigado pela sugestão.

Pelo teste superficial que fiz no service browser, a solução que indicou o yoda funcionou perfeitamente:

$userVO = (object) $data["userVO"];

No entanto quando implementar isto a sério dou mais feedback.

Muito obrigado!


"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Share this post


Link to post
Share on other sites
taviroquai

Continuo a achar que ficas melhor servido com um método tipo import() embora agora pareça desnecessário... mas isto sou eu...

Share this post


Link to post
Share on other sites
Hipnoted

Penso que no meu caso não faz muito sentido, primeiro porque tinha de implementar isso em todos os VOs, segundo porque os VOs do cliente têm de ser iguais...


"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Share this post


Link to post
Share on other sites
taviroquai

Penso que no meu caso não faz muito sentido, primeiro porque tinha de implementar isso em todos os VOs

Herança?

segundo porque os VOs do cliente têm de ser iguais...

Pois... isso já deve ser mais xato...

Share this post


Link to post
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.