Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tbao

Variaveis no php 5.3.0

Recommended Posts

Olá, boa noite pessoal..

 

Minha dúvida é a seguinte, aprendi que no php você não precisa declarar variaveis antes de usa-la, por exemplo, se eu ainda não estivesse usado a variavel $nova_variavel ainda e no meio do script coloca-se $nova_variavel++ a variavel automoticamente eteria o valor 1 atribuida a ela, mas hoje, depois de atualizar meu servidor local para a versão php 5.3.0 , simplesmente dá variavel indefinida se tento execultar a operação mensionada, pra realizar a operação eu preciso atribuir um valor a variavel antes (por exemplo $nova_variavel = null ;) e depois execultar $nova_variavel++ .

 

Isso é uma nova regra desta versão do php ou meu apache tá "caducando"?

 

desde já vlw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não é do php 5.3. É referente a register_globals.

 

A variável só existirá automaticamente se essa diretriz estiver habilitada, o que NÃO acontece por padrão desde o PHP 4.2.0.

 

Prefira mantê-la em off (ela não existirá no php 6, ou seja, será SEMPRE off) e iniciar SEMPRE as variáveis antes de incrementá-las, cancatená-las etc. É uma boa prática de programação

Compartilhar este post


Link para o post
Compartilhar em outros sites

não é do php 5.3. É referente a register_globals.

 

A variável só existirá automaticamente se essa diretriz estiver habilitada, o que NÃO acontece por padrão desde o PHP 4.2.0.

 

Prefira mantê-la em off (ela não existirá no php 6, ou seja, será SEMPRE off) e iniciar SEMPRE as variáveis antes de incrementá-las, cancatená-las etc. É uma boa prática de programação

 

Olá, vlw pela resposta, eu uso o WAMP SERVER 2.0 e nunca aconteceu isso, eles devem ter deixado register_globals off nesta ultima atualização ataum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros.

 

Pode ser isso também.

 

 

Além de manter register_globals em off, deixe display_errors em on e error_reporting em E_ALL. Após concluir o desenvolvimento de um sistema, mude display_errors para off, para não exibir o erro ao usuário.

 

Por isso é bom ter um sistema personalizado de geração de logs de erro. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho o mesmo problema com as variáveis.

Alterei o PHP.ini register_global para on e permanece acontecendo a mesma mensagem de undefined variable.

Alterei certo (apesar de sua recomendação para deixar em off)? E se deixar em off, a única solução é inicializar a variável, antes de usá-la ? Alguma outra providência ?

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros.

 

Pode ser isso também.

 

 

Além de manter register_globals em off, deixe display_errors em on e error_reporting em E_ALL. Após concluir o desenvolvimento de um sistema, mude display_errors para off, para não exibir o erro ao usuário.

 

Por isso é bom ter um sistema personalizado de geração de logs de erro. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros.

 

Pode ser isso também.

 

 

Além de manter register_globals em off, deixe display_errors em on e error_reporting em E_ALL. Após concluir o desenvolvimento de um sistema, mude display_errors para off, para não exibir o erro ao usuário.

 

Não sei se concordo com essa proposição destacada. Pelo menos eu faço o amsi certinho possível, verificado umas três vezes para não haver possibilidade de erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas sempre pove haver possibilidade de erro. Mesmo o código estando impecavel.

Pode ser alguma entrada do usuario, algum erro na rede do servidor, sei la.

 

Mas NUNCA NUNCA deixe o usuário ver nenhum erro. Pega mal, e se esse usuario estiver mal-intensionado, ja era.

 

Então tu faz o seguinte. Usa um error_handler para o PHP enviar todos os erros para o teu email.

Se der o erro, o usuario nao vai ver, e tu vai resolver rapidinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

está incrementando uma variável que não foi inicializada.

 

$foo++ significa que está incrementando uma variável declarada

 

se não existe essa declaração, é gerado um erro e_warning.

 

quando o e_warning está desativado, o PHP assume valor null e ignora o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aprendi que no php você não precisa declarar variaveis antes de usa-la

 

Sua afirmação está incorreta.É necessário sim declarar uma variavel antes de usa-la.

...atribuir um valor a variavel antes (por exemplo $nova_variavel = null ;) e depois execultar $nova_variavel++...

 

Os tipos que suportam o Operador Unário de Post-Increment (++) no PHP são numericos.O valor null não se enquadrando em nenhum tipo,o que faz com que o resultado de $nova_variavel++ ser o valor antes atribuido (null).

<?php
$a = null;
$b = 'a';
$c = false;
var_dump($a++); //NULL
var_dump($b++); //string(1) "a"
var_dump($c++); //bool(false)
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas sempre pove haver possibilidade de erro. Mesmo o código estando impecavel.

Pode ser alguma entrada do usuario, algum erro na rede do servidor, sei la.

 

O André está totalmente correto.

 

Existem N fatores, muitas vezes alheios ao código, que podem causar um erro. Conexão lenta, server mal configurado (ou o tec do data deixou cair o café no server), enfim muitas vezes seu código está testado, depurado e ainda assim seu sistema pode cair.

 

Mas NUNCA NUNCA deixe o usuário ver nenhum erro. Pega mal, e se esse usuario estiver mal-intensionado, ja era.

 

NUNCA NUNCA mesmo, o problema não é pegar mal, se ocorreu um erro: Ou o código não foi bem testado ou alguma coisa alheia ao código ocorreu, independente do motivo, você não sabe quando nem porque (até depurar) e, consequentemente você não sabe a mensagem que será enviada ao usuário. Imagina que o cara do data por algum motivo mudou as configuração da sua base de dados, ai sua aplicação vai fazer a conexão e:

 

Acesso negado ao ..... usando senha ....

erro na linha ...: connect( 'host','user', 'senha')

 

Ai você imagina o que pode ocorrer quando o data resolver liberar novamente as permissões...

 

Então tu faz o seguinte. Usa um error_handler para o PHP enviar todos os erros para o teu email.

Se der o erro, o usuario nao vai ver, e tu vai resolver rapidinho.

 

Bom André, isso é legal, porém aqui vai uma dica de um cara que usa isso em vários projetos: "Use com moderação"

Algumas vezes é melhor apenas gravar o log criptografado em uma base de dados do que ficar enviando emails. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

eibon, não sei se é configuração, mas no meu servidor de teste, se eu coloco como você colocou, $b = 'a' e dou o ++ dentro do var_dump ele exibe 'a'

Agora se eu faço assim

 

<?php
$teste = 'a';
$teste++;
var_dump($teste);
?>

Ele imprime

 

string(1) "b"

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

eibon, não sei se é configuração, mas no meu servidor de teste, se eu coloco como você colocou, $b = 'a' e dou o ++ dentro do var_dump ele exibe 'a'

 

Não é configuração não, veja abaixo usando PHP/5.3.0 com o ZendServer/4.0

 

$a = 1;
var_dump($a++); //int(1)

Quando o operador de pós incremento é utilizado é retornado o valor da variável e somente então que ela é incrementada,utilizando o exemplo do eibon:

 

$a = null;
$b = 'a';
$c = false;
var_dump($a++); //NULL
var_dump($b++); //string(1) "a"
var_dump($c++); //bool(false)

var_dump($a); //int(1)
var_dump($B); //string(1) "b"
var_dump($c); //bool(false)

Agora com os operadores de pré-incremento:

 

$a = null;
$b = 'a';
$c = false;
var_dump(++$a); //int(1)
var_dump(++$B); //string(1) "b"
var_dump(++$c); //bool(false)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tinha confundido o Post-Increment com o Pre-Increment.Que beleza!Mas quando certa variavel não suporta um operador,o que permanece é seu valor antigo.

--

Seguinte,dei uma olhada no source do PHP para ver o que a increment realmente faz e vejam:

ZEND_API int increment_function(zval *op1) /* {{{ */
{
	switch (Z_TYPE_P(op1)) {
		case IS_LONG:
			if (Z_LVAL_P(op1) == LONG_MAX) {
				/* switch to double */
				double d = (double)Z_LVAL_P(op1);
				ZVAL_DOUBLE(op1, d+1);
			} else {
			Z_LVAL_P(op1)++;
			}
			break;
		case IS_DOUBLE:
			Z_DVAL_P(op1) = Z_DVAL_P(op1) + 1;
			break;
		case IS_NULL:
			ZVAL_LONG(op1, 1);
			break;
		case IS_STRING: {
				long lval;
				double dval;

				switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) {
					case IS_LONG:
						efree(Z_STRVAL_P(op1));
						if (lval == LONG_MAX) {
							/* switch to double */
							double d = (double)lval;
							ZVAL_DOUBLE(op1, d+1);
						} else {
							ZVAL_LONG(op1, lval+1);
						}
						break;
					case IS_DOUBLE:
						efree(Z_STRVAL_P(op1));
						ZVAL_DOUBLE(op1, dval+1);
						break;
					default:
						/* Perl style string increment */
						increment_string(op1);
						break;
				}
			}
			break;
		default:
			return FAILURE;
	}
	return SUCCESS;
}
Só valores escalares podem ser incrementados.

--

case IS_NULL:
    ZVAL_LONG(op1, 1);
    break;
Se a variavel conter um valor nulo,será atribuido a ela o valor 1 e o tipo long,que é uma especialização do tipo integer.

--

case IS_STRING: {
    long lval;
    double dval;

    switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) {
        case IS_LONG:
            efree(Z_STRVAL_P(op1));
            if (lval == LONG_MAX) {
                /* switch to double */
                double d = (double)lval;
                ZVAL_DOUBLE(op1, d+1);
            } else {
               ZVAL_LONG(op1, lval+1);
            }
            break;
        case IS_DOUBLE:
            efree(Z_STRVAL_P(op1));
            ZVAL_DOUBLE(op1, dval+1);
            break;
        default:
            /* Perl style string increment */
            increment_string(op1);
            break;
    }
}
break;
Se a string for numerica,ele básicamente incrementa o valor numérico dela,senão chama o método increment_string que básicamente faz o seguinte:pega o valor ASCII do ultimo caracter e incrementa(caso este esteja na faixa A-Ya-y0-8),atribuindo a variavel o caracter relativo a esse valor (sério? =o).Se o caracter atual for um z,um Z ou um 9,será substituido respectivamente por um a,um A ou um 0.O processo continua até que o caracter atual deixe de ser esses 3 especiais.Se a string só for composta desses caracteres,o primeiro caracter da string será um a caso o ultimo caracter checado sem modificações (o primeiro caracter no caso) seja um z,um A caso seja um Z e um 1 caso seja um 9.

Demonstração:

<?php
$a = null;
$m = false;
$j = 'abc';
$c = 'Zzz99';
$d = '9zZ';
$e = '999';
$f = 'z99zZ';
/*prova da explicação do incremento de valores nulos*/
debug_zval_dump(++$a); //long(1) refcount(2)
/*prova da explicação do incremento de strings*/
debug_zval_dump(++$j); //string(3) "abd" refcount(2)
debug_zval_dump(++$c); //string(6) "AAaa00" refcount(2)
debug_zval_dump(++$d); //string(4) "10aA" refcount(2)
debug_zval_dump(++$e); //long(1000) refcount(2) 
debug_zval_dump(++$f); //string(6) "aa00aA" refcount(2)
/*a variavel não suporta o operador,logo seu valor é mantido*/
debug_zval_dump(++$m); //bool(false) refcount(2)
?>
--

Os trechos do source do PHP que me referi se encontram no arquivo zend_operators.c que se encontra na diretoria Zend.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.