Ir para conteúdo

POWERED BY:

Arquivado

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

Fabem

[Resolvido] ERRO: Cannot use object of type ... as array

Recommended Posts

Bom dia pessoALL

 

Na função abaixo me diz que não posso usar o "$this->itens" como um array. Qual a solução?

 

 function valorCompra(){
        $soma = 0;
        foreach ($this->itens as $codigo => $valor)
            $soma += $this->itens[$codigo]["preco"] * $this->itens[$codigo]["qtde"];		
        return (double)$soma;
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, foi setado como array no início da classe.

 

class ... {
var $itens, $lista;

    function ...(){
        ...
        settype($this->itens,"array");
        ...
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites


function valorCompra(){

$soma = 0;

foreach ($this->itens as $codigo => $valor)

$soma += $this->itens[$codigo]["preco"] * $this->itens[$codigo]["qtde"];//ERRO NESTA LINHA

return (double)$soma;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria essa a sua logica:

$itens = array()
$itens[$codigo_do_produto] = $objeto_produto;
$itens[$codigo_do_produto2] = $objeto_produto;
$itens[$codigo_do_produto3] = $objeto_produto;
[..]
Ou

$itens = array()
$itens[$codigo_do_produto] = $array_produto;
$itens[$codigo_do_produto2] = $array_produto
$itens[$codigo_do_produto3] = $array_produto
[..]
Estou correto?

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, exato.

 

 function addItem($codigo, $qtde, $preco){
        if (!array_key_exists($codigo, $this->itens)) {
            $this->itens[$codigo] = array(
                "codigo" => $codigo,
                "qtde" => $qtde,
				"preco" => $preco
        );
            ksort($this->itens);
            $this->lista = $this->itens;
            return array_key_exists($codigo, $this->itens);
        } 
		else {
            $this->itens[$codigo]["qtde"] = $this->itens[$codigo]["qtde"] + $qtde;
            $this->lista[$codigo] = $this->itens[$codigo];
        }
    }

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o seguinte:

class Carrinho
{
 public $itens = array() ;
 function valorCompra()
 {
  $soma = 0 ;
  foreach ( $this->itens as $codigo => $valor )
  {
   $soma += $this->itens[$codigo]["preco"] * $this->itens[$codigo]["qtde"] ; //ERRO NESTA LINHA
  }
  return ( double )$soma ;
 }
 function addItem( $codigo, $qtde, $preco )
 {
  if ( ! array_key_exists( $codigo, $this->itens ) )
  {
   $this->itens[$codigo] = array( "codigo" => $codigo, "qtde" => $qtde,"preco" => $preco ) ;
   ksort( $this->itens ) ;
   $this->lista = $this->itens ;
   return array_key_exists( $codigo, $this->itens ) ;
  }
  else
  {
  $this->itens[$codigo]["qtde"] = $this->itens[$codigo]["qtde"] + $qtde ;
  $this->lista[$codigo] = $this->itens[$codigo] ;
  }
 }
}
$carrinho = new Carrinho() ;
$carrinho->addItem( 1, 10, 3.50 ) ;
$carrinho->addItem( 2, 10, 3.50 ) ;
$carrinho->addItem( 2, 10, 3.50 ) ;
$carrinho->addItem( 4, 10, 3.50 ) ;
die( $carrinho->valorCompra() ) ;

Não deu nenhum erro, debuga as variaveis que você passa no metodo addItem.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só a solução:

 

class ... {
var $itens, $lista;

    function ...(){
        ...
        $this->itens = array(); //ao invés de settype($this->itens,"array");
        ...
    }

Parece brincadeira, mas não é.

 

Obrigado pela atenção.

 

Um abraço

 

Só mais um detalhe: localhost funcionava, mas no servidor não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só para deixar registrado, nas verdade a solução não foi a que passei, mas sim pq no meu computador as variáveis globais deixo desabilitadas e no servidor não estava desabilitado.

 

A variável $this->itens estava se confundindo com alguma outra varíavel global $itens, não tipada.

 

Solução:

 

Desabilitar as variáveis globais do servidor. Por segurança, faça isso sempre. Sempre desabilito com código PHP, mas como arquivo com classe não incluia o arquivo que uso para desabilir as variáveis globais, dava esse erro.

 

Como desabilitar:

 

Com PHP:

 

ini_set("register_globals","off");

Com .htaccess:

 

php_flag register_globals off

Com isto aprendi a sempre usar o .htaccess da raiz para desabilitar para todo o site.

 

P.S.: A mesma solução se aplica para o erro "Fatal error: Cannot use object of type __PHP_Incomplete_Class as array".

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.