Ir para conteúdo

POWERED BY:

Arquivado

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

[ GuTo ]

[Resolvido] PHPOO - Propriedade armazenando array

Recommended Posts

Boa tarde,

 

Dêem uma olhada no código abaixo.

Criei uma classe Pessoa na qual quero armazenar o(s) telefone(s) de uma pessoa.

Caso 1: a pessoa pode ter apenas 1 número de telefone.

Caso 2: a pessoa pode ter MAIS de 1 número de telefone, pode ter vários.

 

Quero poder passar no parâmetro do meu método setTelefone($value):

- uma string como "(11) 1111-1111"

- ou também um array como "array('(22) 2222-2222', '(22) 3333-3333')"

 

Quando passo um array, não estou conseguindo guardar os valores, pois dá este erro:

Notice: Array to string conversion in C:\Inetpub\wwwroot\propriedade-array.php on line 28

 

public function setTelefone($Telefone)
{
	if (is_array($Telefone))
		$this->$Telefone = $Telefone; # <----------------- # Como resolver? // like array
	else
		$this->Telefone = $Telefone; # aqui funciona // like string
}

 

Para ver o código rodando, acesse o link http://antonioaugusto.com.br/testes/propriedade-array.php.

Para ver o código fonte:

<?
function depurar($var, $continue = true)
{
   echo '<pre>';
print_r($var);
echo '</pre>';
   if(!$continue) exit();
}

class Pessoa
{
# Quero armazenar sempre um array aqui
private $Telefone = array();

# Quero sempre retornar um array aqui, mesmo quando tiver apenas 1 item.
public function getTelefone()
{
	return $this->Telefone;
}

public function setTelefone($Telefone)
{
	if (is_array($Telefone))
	{
		echo '<p style="color:red">Veio como array</p>';
		# Se vier um array, tudo ok.
		# ERRO NESTA LINHA 28 - ABAIXO
		$this->$Telefone = $Telefone; # <----------------- # Como resolver?
		# ERRO NESTA LINHA 28 - ACIMA
	}
	else
	{
		echo '<p style="color:green">Veio como string</p>';
		# Se vier uma string, transformar em array.
		$this->Telefone = array($Telefone);	 
	}
}
}

# TESTE COM STRING - INICIO
echo '<h2>TESTE COM STRING - INICIO - STATUS = <span style="color:green">OK</span></h2>';
$fone1string = '(11) 9988-7766';
echo '<strong>Valor string que vou passar:</strong> ';
depurar($fone1string);
$p1 = new Pessoa();
$p1->setTelefone($fone1string);
echo '<strong>Teste passando string retornou:</strong> '. $p1->getTelefone() .'<br /><strong>print_r($p1->getTelefone()): </strong>';
depurar($p1->getTelefone());
# TESTE COM STRING - FIM
echo "<hr />";

# TESTE COM ARRAY - INICIO
echo '<h2>TESTE COM ARRAY - INICIO - STATUS = <span style="color:red">COM PROBLEMA</span></h2>';
$fone2array = array('(22) 1111-1111', '(22) 2222-2222');
echo '<strong>Valor array que vou passar:</strong> ';
depurar($fone2array);
$p2 = new Pessoa();
$p2->setTelefone($fone2array);
echo '<strong>Teste passando array retornou:</strong> '. $p2->getTelefone() .'<br /><strong>print_r($p2->getTelefone()): </strong>';
depurar($p2->getTelefone());
echo '<strong style="color:red; border:2px dashed darkred; padding:5px;">Aqui acima meu retorno deveria ser um array com posicoes.</strong>';
# TESTE COM ARRAY - FIM
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

if (is_array($Telefone))

$this->Telefone[] = $Telefone;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, desculpe não comentar antes, mas isso já tentei antes e não funciona:

 

Fatal error: Cannot use [] for reading in C:\Inetpub\wwwroot\propriedade-array.php on line 28

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
class Pessoa
{
	private $Telefone = array();
	
	public function getTelefone()
	{
		return $this->Telefone;
	}

	public function setTelefone($Telefone)
	{
		if ( is_array($Telefone) )
		{
			echo '<p style="color:red">Veio como array</p>';
			$this->Telefone[] = $Telefone;
		}
	}
}
$pessoa = new Pessoa();

$arr = Array('(22) 2222-2222', '(11) 1111-1111');
$pessoa->setTelefone( $arr );


echo '<pre>';
var_dump( $pessoa->getTelefone() );

saída:

Veio como array

 

array(1) {

[0]=>

array(2) {

[0]=>

string(14) "(22) 2222-2222"

[1]=>

string(14) "(11) 1111-1111"

}

}

 

oque você não pode fazer, é tentar imprimir o array com echo, como se ele fosse string

echo '<strong>Teste passando array retornou:</strong> '. $p2->getTelefone() .'<br />
viu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Repare no retorno do seu array.

É um array com 1 elemento que é um array com 2 elementos.

 

Veio como array
 array(1) {
  [0]=>   array(2) {
    [0]=>     string(14) "(22) 2222-2222"
    [1]=>     string(14) "(11) 1111-1111"
  }
}

 

E deveria ser:

Array (
    [0] => (22) 1111-1111
    [1] => (22) 2222-2222
)

 

Alguém sabe exatamente como resolver? Por favor testar antes de responder.

Compartilhar este post


Link para o post
Compartilhar em outros sites

<_< cara.. vou nem falar nada sobre esse teu comentário.

 

if ( is_array($Telefone) )
		{
			echo '<p style="color:red">Veio como array</p>';
			foreach( $Telefone AS $tel )
				$this->Telefone[] = $tel;
		}
saída:

array(2) {

[0]=>

string(14) "(22) 2222-2222"

[1]=>

string(14) "(11) 1111-1111"

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehehe, mal aí o comentário. na hora eu tava sem comer a horas e um pouco anti-pático, hehehe. mto ácido lático na corrente sanguínea, hehehe.

te agradeço pelo ajuda. usar o foreach é o jeito mesmo.

 

para ver o resultado final, basta acessar o link: http://antonioaugusto.com.br/testes/propriedade-array.php

 

o código final, graças a tua ajuda, ficou assim:

<?
function depurar($var, $continue = true)
{
   echo '<pre>'. print_r($var, true) . '</pre>';
   if(!$continue) exit();
}

class Pessoa {
   # Quero armazenar sempre um array aqui
   private $Telefone;

   # Quero sempre retornar um array aqui, mesmo quando tiver apenas 1 item.
   public function getTelefone() { return $this->Telefone; }
   public function setTelefone($Telefone, $Add = true) {
       if ($Add)
       {
           if (is_array($Telefone))
               foreach ($Telefone as $tel)
                   $this->Telefone[] = $tel;
           else
               $this->Telefone[] = $Telefone;
       }
       else
           $this->Telefone = $Telefone;
   }
}

$p = new Pessoa();

echo '<div>';
echo "\n\t<h2>Adicionando valores</h2>";
echo "\n\t<h4>Passando string</h4>";
$fone = '(11) 1111-1111'; $p->setTelefone($fone);
$fone = '(11) 2222-2222'; $p->setTelefone($fone);
depurar($p->getTelefone());

echo "\n\t<h4>Passando array</h4>";
$fone = array('(22) 1111-1111', '(22) 2222-2222'); $p->setTelefone($fone);
$fone = array('(22) 3333-3333', '(22) 4444-4444'); $p->setTelefone($fone);
depurar($p->getTelefone());
echo '</div>';

echo '<div>';
echo "\n\t<h2>Sem adicionar valores</h2>";
echo "\n\t<h4>Passando string</h4>";
$fone = '(11) 1111-1111'; $p->setTelefone($fone, false);
$fone = '(11) 2222-2222'; $p->setTelefone($fone, false);
depurar($p->getTelefone());

echo "\n\t<h4>Passando array</h4>";
$fone = array('(22) 1111-1111', '(22) 2222-2222'); $p->setTelefone($fone, false);
$fone = array('(22) 3333-3333', '(22) 4444-4444'); $p->setTelefone($fone, false);
depurar($p->getTelefone());
echo '</div>';
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve,

 

Vi sua mensagem só agora no MSN, foi mal.

 

Segue codigo abaixo:

 

<?php

function depurar($var, $continue = true)
{
    printf('<pre>%s</pre>', print_r($var,true));
    if(!$continue)
    {
        exit();
    }
}

class Pessoa
{
    private $telefone;
    public function __construct()
    {
        $this->telefone = array();
    }
    public function setTelefone($telefone)
    {
        if(is_array($telefone))
        {
            foreach($telefone as $numeroTelefone)
            {
                array_push($this->telefone, $numeroTelefone);
            }
        }
        else
        {
            array_push($this->telefone, $telefone);
        }
    }    
    public function getTelefone()
    {
        return $this->telefone;
    }
}

$ursao = new Pessoa();
$ursao->setTelefone('(11) 8155 2010');
$ursao->setTelefone(array('(11) 8155 0000', '(11)7070 7070', '(11)6666 6969'));


depurar($ursao->getTelefone());

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara.. nesse caso:

foreach($telefone as $numeroTelefone)
            {
                array_push($this->telefone, $numeroTelefone);
            }

usa entao um array_merge() :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, você poderia trabalhar com recursão nesse método setTelefone(), algo assim:

 

public function setTelefone( $telefone ) {

   if( is_array( $telefone ) ) {

       foreach( $telefone as $numeroTelefone ) {
           $this -> setTelefone($numeroTelefone);
       }

   } else {

       $this->telefone[] = $telefone;
   }
}

Se o parâmetro $telefone for um array, o próprio método será invocado novamente, mas com o valor da iteração foreach corrente. Se esse valor também for um array, a operação se repete até que ovalor não seja um array.

 

Quando não mais for, cairá no else e apropriedade será populada.

 

P.S.: Definir como array() uma propriedade não precisa ser no construtor. Pode fazer direto fora dele:

 

private $telefone = array();

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão do array_merge me parece melhor dentre todas, é a que estava pensando inicialmente, mas algo não funcionava. Enfim...

A questão da recursividade ficou bem bonita de se ver realmente, mas o array_merge fica melhor mesmo :)

    private $_Telefone = array();

   # Quero sempre retornar um array aqui, mesmo quando tiver apenas 1 item.
   public function getTelefone() { return $this->_Telefone; }
   public function setTelefone($Telefone, $Add = true) {
       if ($Add)
       {
           # Se estiver adicionando
           if (is_array($Telefone))
               # Se for array, une os arrays
               $this->_Telefone = array_merge($this->_Telefone, $Telefone);
           else
               # Se for string                
               array_push($this->_Telefone, $Telefone);
       }
       else
           # Sempre seta um novo valor, seja string ou array
           $this->_Telefone = is_array($Telefone) ? $Telefone : array($Telefone);
   }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, é a sua forma de pensar, eu já discordo. Para se ver qual a melhor maneira, um bom e extenso teste de performance seria necessário.

 

Mas, em todo caso, você pode otimizar o trecho:

 

if (is_array($Telefone))
               # Se for array, une os arrays
               $this->_Telefone = array_merge($this->_Telefone, $Telefone);
           else
               # Se for string                
               array_push($this->_Telefone, $Telefone);

Para:

 

$this->_Telefone = array_merge($this->_Telefone, (array) $Telefone);

Assim, se apenas um valor for passado, como string, o cast forçado da variável $Telefone fará, em execução, isto:

 

$Telefone = '1234-5678';

Se transformar em:

 

$Telefone = array( '1234-5678' );

Sempre mesclando um array. ;)

 

Daí evita-se um condicional adicional, melhorando pelo menos um pouco o tempo de excução. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.