Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou com um problema ao migrar o sistema para a versão 5.2.5 PHP. Neste respeito montei dois exemplos para testes. Se funcionar com alguém mantendo o atributo private que é a forma correta, gostaria de que passa-se como está a configuração do servidor se for configuração de servidor senão o que foi feito para solucionar.
1 Exemplo sem solução.
<?php
class Modelo {
//Método construtor
public function __construct() {
echo "Construtor:<br />";
echo "<pre>";
print_r(array_keys(get_object_vars($this)));
echo "</pre>";
}
}
class Teste extends Modelo {
//Atributo
private $atributo1;
private $atributo2;
private $atributo3;
public function setAtributo1() {
parent::$this->Modelo();
}
public function setAtributo2() {
parent::$this->Modelo();
}
public function setAtributo3() {
parent::$this->Modelo();
}
}
$objeto = new Teste();
?>
Resultado da versão 5.2.5
Construtor:
Array
(
)
Resultado da versão 5.2.3
Construtor:
Array
(
[0] => atributo1
[1] => atributo2
[2] => atributo3
)
2 Exemplo
<?php
class Modelo {
//Método construtor
public function __construct() {
echo "Construtor:<br />";
echo "<pre>";
print_r(array_keys(get_object_vars($this)));
echo "</pre>";
}
}
class Teste extends Modelo {
//Atributo
//private $atributo1;
//private $atributo2;
//private $atributo3;
public $atributo1;
public $atributo2;
public $atributo3;
public function setAtributo1() {
parent::$this->Modelo();
}
public function setAtributo2() {
parent::$this->Modelo();
}
public function setAtributo3() {
parent::$this->Modelo();
}
}
$objeto = new Teste();
?>
Resultado da versão 5.2.5 usando no atributo public assim funciona.
Construtor:
Array
(
[0] => atributo1
[1] => atributo2
[2] => atributo3
)
By Sandro
Já sim, todos os meios possíveis. O Último foi colocando var $atributo1 que também funciona como quando mudando para public.
Acabei de entender o problema. Esta função get_object_vars pega somente variável var ou usando atributo public da classe. Sendo assim a versão 5.2.3 estava pegando de private e protected e montava para mim um array usando a função array_keys que precisava para montar os nós de xml que o sistema usa. Agora isso caracterizou bug, que foi corrigido a partir da 5.2.4. Neste aspecto preciso criar uma solução que pegue os nomes dos atributos de uma classe que estão como private para eu montar os nós de xml que o sistema usa, pq senão terei que passar todas a entidades para public ou var que não é o correto para meu sistema. Alguém tem alguma solução?.
Exemplo
class Teste extends Modelo {
//Atributos
private $aluno;
private $turma;
public function setAluno($aluno) {
$this->aluno = $aluno;
}
public function getAluno(){
return $this->aluno;
}
public function setTurma($turma) {
$this->turma = $turma;
}
public function getTurma(){
return $this->turma;
}
}pegando o nome atributo na classe montaria o xml logo após o nó <alunos> como abaixo.
>
<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
<alunos>
<aluno>Fulano de Tal</aluno>
<turma>F 223</turma>
</alunos>uma possivel solução é você ter um metodo dentro da propria classe que retorne o xml montado, tipo:
class Teste extends Modelo {
//Atributos
private $aluno;
private $turma;
public function setAluno($aluno) {
$this->aluno = $aluno;
}
public function getAluno(){
return $this->aluno;
}
public function setTurma($turma) {
$this->turma = $turma;
}
public function getTurma(){
return $this->turma;
}
public function toXml(){
// codigo para montar xml
return $xml;
}
}
voce já testou com as propriedades setadas como protected ao inves de private???
bem estranho esse erro!!!