Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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):
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
{
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);
}
}
}
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());
echo "<hr />";
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>';
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
<?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() );>
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 ?
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.
<_< 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"
}
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>';
?>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
cara.. nesse caso:
foreach($telefone as $numeroTelefone)
{
array_push($this->telefone, $numeroTelefone);
}
usa entao um array_merge() :lol: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();
;)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);
}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
if (is_array($Telefone))
$this->Telefone[] = $Telefone;