Usando a DateTime
classe, se eu tentar executar o seguinte código:
$mydate = new DateTime();
echo $mydate->date;
Vou receber de volta esta mensagem de erro
Aviso: Propriedade indefinida: DateTime :: $ date ...
O que não faz sentido porque, ao ser executado var_dump()
na variável $mydate
, mostra claramente que essa propriedade existe e está acessível publicamente:
var_dump($mydate);
object(DateTime)[1]
public 'date' => string '2012-12-29 17:19:25' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
Isso é um bug no PHP ou estou fazendo algo errado? Estou usando o PHP 5.4.3.
Respostas:
Este é um problema conhecido .
Por alguma razão, você não deveria ser capaz de acessar a propriedade, mas a
var_dump
mostra de qualquer maneira. Se você realmente deseja obter a data nesse formato, use aDateTime::format()
função.fonte
Além de chamar,
DateTime::format()
você pode acessar a propriedade usando o reflexo:Isso é um pouco mais rápido do que usar
format()
porqueformat()
formata uma sequência de tempo que já foi formatada. Especialmente se você fizer isso muitas vezes em um loop.No entanto, este não é um comportamento normal do PHP. Um relatório de bug já foi preenchido como @Nile mencionado nos comentários acima.
fonte
Conforme observado pelas outras respostas, é um problema com o PHP que não está resolvido até hoje, mas se for um 'efeito colateral' de,
var_dump()
não tenho certeza ..O que tenho certeza é que, se as propriedades de
DateTime
onde deveriam ser usadas por nós, teriam sido disponibilizadas. Mas, como muitas classes internas, eles não são e você não deve confiar em métodos "hacky" ou "glitchy" para consertar seu código. Em vez disso, você deve usar sua API .Se você não estiver satisfeito, pode estender o curso ou talvez usar Carbon que o estende para você.
Se você se perguntar como
var_dump()
cria uma saída falsa de um objeto, dê uma olhada em__debugInfo()
fonte
A propriedade de data de DateTime é protegida.
Você pode exibir a data com a função de formato.
Ou você pode converter em array:
fonte
Se você apenas usar um var_Dump antes de perguntar a data da propriedade, tudo funcionará bem:
Isso oferece:
Portanto, você vê que a data da propriedade existe até para o objeto. Eu não consigo entender esse comportamento. Apenas comente o var_Dump e você obterá o erro novamente.
fonte