php 4 OOP question

3 views
Skip to first unread message

frederico schardong

unread,
Jul 28, 2010, 3:17:22 PM7/28/10
to Tche...@googlegroups.com
Salve galera,

Aqui no trampo usamos php4 (infelizmente), e estou tentando fazer o seguinte:

function __construct($titulo = '', $campos, $botao = uteis::botao_gravar())

Porém obtenho o seguinte erro:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM,
expecting ')' in /var/www/... on line 24 (que é a linha do construtor)

Não posso definir como valor padrão de um parâmetro construtor da
classe o retorno de uma função estática? =S

--
Thanks,
Frederico Schardong,
Linux registered user #500582

Rafael Jeffman

unread,
Jul 28, 2010, 3:41:41 PM7/28/10
to tche...@googlegroups.com
AFAIK, em linguagens de programação os valores default devem ser
contantes. O retorno de uma função não é constante (mesmo que seja, o
compilador, normalmente, não saberá disso).

Do manual do PHP:

"The default value must be a constant expression, not (for example) a
variable, a class member or a function call."

Ou seja: NÃO.

Rafael

http://www.rafaelfoto.com
Fotografia de Casamentos, Aniversários, Formaturas, Shows, Eventos
Esportivos, e festas em geral.

2010/7/28 frederico schardong <fred...@gmail.com>:

> --
> Mensagem enviada para <http://groups.google.com/group/tchelinux>.
>

Gustavo Dutra

unread,
Jul 29, 2010, 8:27:57 AM7/29/10
to TcheLinux
Realmente... até nem faz sentido por o valor padrão um retorno de uma
outra classe direto na assinatura, mas tu pode atribuir a ela um valor
null e depois verificar:

if (is_null($botao)) {
$botao = Uteis::botao_gravar();
}

Outra coisa, php4 não tem suporte ao __contruct, como tu implementou
isso? Criou a classe Object ? Sempre fiquei curioso se existia uma
outra maneira...

frederico schardong

unread,
Jul 29, 2010, 8:59:41 AM7/29/10
to tche...@googlegroups.com
Se tu criar uma função com o mesmo nome da classe ela vai ser o
construtor da classe.

Eu fiz o __construct pra quando o servidor for alterado pra php 5 já
sair funcionando. O problema é que sempre que instanciar uma classe
tem que chamar o __construct, ou da pra fazer uma função com o nome da
classe em cada classe e ali chamar o __construct.

Agora vai uma difícel,

como "emular" um método ou atributo private no php 4?

> --
> Mensagem enviada para <http://groups.google.com/group/tchelinux>.
>

--
Thanks,
Frederico Schardong,
www.fredericoschardong.wordpress.com
Linux registered user #500582

Rafael Jeffman

unread,
Jul 29, 2010, 9:10:29 AM7/29/10
to tche...@googlegroups.com
Na documentação, assim com se faz em Pyton.

Normalmente, assume-se que coisas "circundadas" por DOIS "underscores"
(e.g.: __X__) não devem ser mechidas.

Atributos publicos, protegidos e privados, são na verdade "convenções"
de linguagens de programação, então essa "dica" é mais ou menos a
mesma coisa.

Rafael

http://www.rafaelfoto.com
Fotografia de Casamentos, Aniversários, Formaturas, Shows, Eventos
Esportivos, e festas em geral.

2010/7/29 frederico schardong <fred...@gmail.com>:

Gustavo Dutra

unread,
Jul 30, 2010, 8:48:13 AM7/30/10
to TcheLinux
O que eu tenho visto e acho mais "bonito", é tu fazer algo do tipo

if (!class_exists("Object")) {
Class Object {
function Object() {
$args = func_get_args();
if (method_exists($this, '__construct')) {
call_user_func_array(array(&$this, '__construct'), $args);
}
if (method_exists($this, '__destruct')) {
register_shutdown_function (array(&$this, '__destruct'));
}
}

function __construct() {}

function __toString() {
return get_class($this);
}
}
}

No PHP5 esta classe já é nativa, por isso o IF acaba sendo
importante... Mas no PHP4 não existe esta classe... Então vai
funcionar

Só tenha certeza de que seus objetos extendam a classe Object


class SuperClass extends Object() {

public __construct() {
/// code...
}

}

class ChildClass extends SuperClass {
public __construct() {
parent::__construct();
// code...
}
}

Quanto a atributos private, assim como Rafael falou do __X__ no
python, a convençao para o php e $_varName.

On Jul 29, 9:59 am, frederico schardong <frede....@gmail.com> wrote:
> Se tu criar uma função com o mesmo nome da classe ela vai ser o
> construtor da classe.
>
> Eu fiz o __construct pra quando o servidor for alterado pra php 5 já
> sair funcionando. O problema é que sempre que instanciar uma classe
> tem que chamar o __construct, ou da pra fazer uma função com o nome da
> classe em cada classe e ali chamar o __construct.
>
> Agora vai uma difícel,
>
> como "emular" um método ou atributo private no php 4?
>

frederico schardong

unread,
Jul 30, 2010, 9:01:39 AM7/30/10
to tche...@googlegroups.com
Sobre as variáveis private, consegui fazer sem usa-las.

Realmente, fica muito mais elegante e fácil criar uma classe e fazer
as minhas estenderem dela do que ficar pondo os constructs nos forms.

Valeu pela dica!

--
Thanks,

Reply all
Reply to author
Forward
0 new messages