php - Ao usar método numa string, não está incluindo os parênteses "()" - Stack Overflow em Português
Ao usar método numa string, não está incluindo os parênteses "()" [duplicada]
Por que essa interpolação de string gera erro (1 resposta)
Para que servem as chavetas {} numa string SQL? (3 respostas)
Tenho o seguinte método em uma classe:
public function cadastrar( $pastor ) {
print $pastor->getIdMembro();  // IMPRIME 6
$string = "INSERT INTO pastores ( idMembro ) VALUES ( $pastor->getIdMembro() ) ";
print $string; // INSERT INTO pastores ( idMembro ) VALUES ( () )
return $this->conexao->query( $string )  ? true : false;
Quando faço apenas print $pastor->getIdMembro()retorna o valor certo, mas quando uso em uma string não funciona e aparecem apenas ():
Por que isso está acontecendo? Por que o resultado é VALUES ( () ) e não VALUES ( 6 )?
Obs: não há erros no console.
editada 17/01 às 12:12
perguntada 17/01 às 11:26
coloque o $pastor->getIdMembro() dentro de { } – Ademilson Santana da Silva 17/01 às 11:30
bom, funcionou. Mas porque APENAS nesse retorno e no SITE todo? O que está acontecendo aqui? – Carlos Rocha 17/01 às 11:32
Relacionada: Explicação sobre concatenação de variáveis em PHP – Woss 17/01 às 12:21
Isso é o que chamamos de interpolação de strings e só funciona no PHP se usado aspas duplas ou heredoc.
O interpretador do PHP, quando encontra uma string com aspas duplas ou heredoc, irá tentar avaliar o seu conteúdo e, para isso, irá percorrer a string da esquerda para a direita. Sempre que encontrar o caractere cifrão, $, o interpretador irá buscar o máximo de caracteres possível para construir o nome da estrutura que foi utilizada.
echo "Saudações $nome, bem-vindo ao Stack Overflow em Português";
O interpretador irá encontrar o caractere $ e percorrer a string até o primeiro caractere que não fará parte do nome da estrutura, neste caso a vírgula, assim ele conseguirá inferir que a variável a ser exibida é $nome.
echo "Olá $pastor->getIdMembro(), tudo bem?";
O interpretador não irá parar no hífen pois entenderá que por se tratar de -> ele deve continuar a análise para construir o nome da propriedade acessada. Assim, a análise do nome parará apenas quando chegar no parêntese, pois esse não pertence ao nome. Desta forma, o que o PHP faz é exibir o valor da propriedade $pastor->getIdMembro seguido de dois parênteses. Como getIdMembro não é uma propriedade do objeto (é um método), será exibida uma string vazia e, se seu servidor estiver devidamente configurado para o ambiente de desenvolvimento, será exibido o alerta Undefined property: Pastor::$getIdMembro.
Como você quer que os parênteses sejam interpretados de forma conjunta com o nome da estrutura, você precisa informar isso ao interpretador através do uso das chaves:
echo "Olá {$pastor->getIdMembro()}, tudo bem?";
Assim, a análise só irá parar ao encontrar a chave final, }, considerando a chamada do método como desejado.
Não usar as chaves ou usar é o que diferencia se estamos fazendo uma interpolação simples ou uma interpolação complexa.
Com a interpolação simples você pode:
Fazer interpolação de variáveis simples: "Olá $nome";
Acessar índices de um array: "Olá $nomes[0]";
Acessar propriedades de um objeto: "Olá $pessoa->nome";
Com a interpolação complexa você pode:
Fazer tudo o que a interpolação simples faz;
Fazer interpolação de variáveis simples: "Olá {$nome}";
Acessar índices de um array: "Olá {$nomes[0]}";
Acessar propriedades de um objeto: "Olá {$pessoa->nome}";
Acessar retorno de métodos: "Olá {$pessoa->getNome()}";
Construir dinamicamente os nomes acessados: "Olá {${$campo}}";
Acessar estruturas encadeadas: "Olá {$pessoa->getEnderecos()[0]->getCidade()->getNome()}";
editada 17/01 às 12:16
respondida 17/01 às 11:59
Acontece isso porque essa forma serve para interpolar VARIÁVEIS numa string, ai você ta tentando interpolar um MÉTODO.
Ele retorna ( ) porque ele entende que $pastor->getIdMembro é um atributo (e busca esse atributo, oq retorna vazio), e então ele entende que os parênteses são apenas continuação da string.
editada 17/01 às 11:48
respondida 17/01 às 11:38
hum, mas na linha de cima, quando faço apenas print $pastor->getIdMembro(), aqui NÃO há necessidade de concatenação. E funciona. Devo ter esse mesmo problema mais pra frente também. Obrigado pela explicação. – Carlos Rocha 17/01 às 11:43
O seu método está correto, o problema foi vc colocar a chamada de um método dentro da string sem envolver ele com { }. Se fosse uma variável ou um atributo, teria funcionado corretamente. – Ademilson Santana da Silva 17/01 às 11:47