Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
tenho o seguinte...
class Classe_1
{
public function teste()
{
print_r( $this-> valor );
}
}
class Classe_2
{
public function testando()
{
$this-> valor = 'opa, estou testando...';
Classe_1::teste();
}
}
estou chamndo como função estática, mas ela nao esta declarada como tal, ele nao acusa erro, nem nada
simplesmente na Classe_1 consigo dar o print na propriedade 'valor', criada em Classe_2
fui testar localmente uma outra situação e sem querer esqueci de setar como static e aconteceu isso
experts... sabem o motivo?
isso não deveria ocorrer nao é?
o que quero saber é pq a classe_1 da **print_r( $this-> valor )**, sendo que não defini esta propriedade nela, tao pouco setei um valor...
como é pq ela encontra **$this-> valor**?Aparentemente ao definir um metodo como static, mesmo sendo de outra class, o php interpreta esse metodo como se fosse do mesmo objecto, basicamente como se importasse esse método. Se fizer na classe_1 print_r($this); verá que o this é a Classe_2. É realmente estranho e não sei até que ponto será falha do PHP ou uma forma diferente de usar metodos de outras classes.
Fiz estes testes para comprovar:
<?php
class Classe_1
{
public function teste()
{
print_r( $this );
print_r( $this->valor );
}
}
class Classe_2
{
public function testando()
{
$this->valor = 'opa, estou testando...';
Classe_1::teste();
}
}
$obj = new Classe_2();
$obj->testando();
<?php
class Classe_1
{
var $x = 'xxx';
public function teste()
{
print_r( $this );
print('<br /> -> ' . $this->x . '<br />');
print_r( $this->valor );
}
}
class Classe_2
{
public function testando()
{
$this->valor = 'opa, estou testando...';
$ob = new Classe_1();
$ob->teste();
echo '<hr />';
Classe_1::teste();
}
}
$obj = new Classe_2();
$obj->testando();Se ainda não fez, habilite os erros do seu script iniciando-o com:
ini_set( 'display_errors', TRUE );
error_reporting( E_ALL | E_STRICT );
Isso porque ou eles estão desativados ou muito baixos para lhe mostrar:
Strict standards: Non-static method Classe_1::teste() should not be called statically, assuming $this from incompatible context
Bruno Augusto, mesmo contendo erro, esse é um comportamento muito bizarro...
no 'teste' do rfps888 a classe incorpora as propriedades da classe que instanciou
print_r( $this );
Classe_2 Object
(
[valor] => opa, estou testando...
)dentro da Classe_1, ainda é possivel chamar os metodos da Classe_2 usando $this
$this-> Metodo_da_Classe_2()
a supressão do erro é o de menos
a questão é essa classe cometendo esse erro
Sim, mas isso não é um erro propriamente dito. É que uma cosa que o PHP tem de ruim são seus "achismos".
Você já deve ter cisto ele "assumir" alguma coisa.
Esqueceu de envolver uma string em aspas? Ele "assume" que é uma constante e disparar um erro por não encontrá-la (se não encontrar, claro).
Nesse caso em particular, por você setar um valor à uma propriedade que não existe, o PHP cria a propriedade ali, na hora, em tempo de execução, com visibilidade pública.
Não é que está havendo uma "incorporação maligna", você apenas se confundiu porque coincidentemente ou não, usou propriedade de mesmo nome em classes diferentes.
é nessas horas que eu amo os conceitos da Orientaçãoa Objetos. Se você fizer as coisas certo, do jeito que têm de ser, você nem percebe esses bichos de sete cabeças do PHP. :lol:
>
é nessas horas que eu amo os conceitos da Orientaçãoa Objetos. Se você fizer as coisas certo, do jeito que têm de ser, você nem percebe esses bichos de sete cabeças do PHP. :lol:
o exemplo foi pra facilitar o entendimento... $this-> valor foi pra 'forçar' a barra mesmo apenas como efeito visual :)
na verdade eu havia esquecido de setar como static
além deste 'achismo' do PHP, quais outros ele tem 'problema'?
tem algum apanhado de relatos em algum lugar sobre o tema?
valeu
O PHP é cheio de achismos, mas acredito que os mais perceptíveis sejam esses dois mesmo, de criação de propriedades e o das constantes.
A propósito, eu vi que você forçou o erro, não estava criticando. :thumbsup:
>
O PHP é cheio de achismos, mas acredito que os mais perceptíveis sejam esses dois mesmo, de criação de propriedades e o das constantes.
tive um caso referente ao class_exists e autoload que tinha me deixado louco... uma falta de leitura da documentação me deixou doidão tentando descobrir pq a classe estava funcionando - quando nao devia, afinal, não a tinha incluido, mas a função fez este papel
ja o caso do topico foi um comportamento estranho, bem fora do comum pra mim
alguns a gente so descobre na hora H, outros dependem de config no server e etc...
>
A propósito, eu vi que você forçou o erro, não estava criticando. :thumbsup:
nao fiquei chateado nao, você é bacana, fala com respeito
Se o metodo não está definido como estático não pode chamá-lo assim. Ou o declara como estatico ou coloca a class2 como uma class extendida da class1.
class Class2 extends Class1 {
//metodos
}