Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

infopc

Valor de class por defeito [resolvido]

Mensagens Recomendadas

infopc

Boa tarde Pessoal.

Tenho uma pergunta para os mais iluminados que eu.

Há alguma forma de atribuir um valor por defeito a uma class?

por exemplo:

class MyClass {
     funtion MyClassTimes($val) {
           return $this * $val;
     }
}

$test = new MyClass;
$test = 1;
echo $test->MyClassTimes(3);
//imprime 3

Isto é possivel?

Obrigado


O que não tem solução, solucionado esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Não, mas é possível:

class MyClass
{
    private myVal = 0;

    public function __construct($valorDefeito = 0)
    {
        $this->myVal = $valorDefeito;
    }

    public function Times($val)
    {
        return $this->myVal * $val;
    }
}

$test = new MyClass(5);
echo ($test->Times(5)); // 25

$test = new MyClass();
echo ($test->Times(5)); // 0


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
infopc

Não, mas é possível:

class MyClass
{
    private myVal = 0;

    public function __construct($valorDefeito = 0)
    {
        $this->myVal = $valorDefeito;
    }

    public function Times($val)
    {
        return $this->myVal * $val;
    }
}

$test = new MyClass(5);
echo ($test->Times(5)); // 25

$test = new MyClass();
echo ($test->Times(5)); // 0

isso não é solução eu quero preencher o myVal desta forma:

$test = 5
$test->Times(5) //25

sendo assim pelo que percebi não é possivel


O que não tem solução, solucionado esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Não podes atribuir um valor a uma variável doutro tipo, não é? Isso é o básico dos básicos...

Apesar do PHP, como linguagem weakly typed que é, ser muito tolerante com os tipos, há certas coisas que não podes fazer porque são, de todo, ilógicas. Querer atribuir um int a um objecto de classe é uma dessas coisas.

A solução que dei é a mais usual neste tipo de situação. Qual é a diferença entre criares o objecto com o valor no construtor ou atribuires o valor directamente depois de o criares?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
infopc

não é assim tão ilógico se olhares para linguagem com o C# ou o rails ou mesmo o javascript onde tudo é um objecto existe esse tipo de abordagem nos tipos. por exepto o tipo int do c# tem métodos com toString() que converte um inteiro em string. se calhar afinal não é o básico dos básicos.

o que eu quero fazer é uma implementação desse tipo para o php de modo que eu possa estender os tipos. Mais uma vez não me parece o básico dos básicos parece-me até bem avançado...


O que não tem solução, solucionado esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

não é assim tão ilógico se olhares para linguagem com o C# ou o rails ou mesmo o javascript onde tudo é um objecto existe esse tipo de abordagem nos tipos.

Errado. Em qualquer linguagem que disseste (excepto Rails, que não é uma linguagem, é uma framework - Ruby é que é uma linguagem) é impossível - lê bem: impossível - atribuir um valor de tipo primitivo a um objecto de classe. Nalgumas linguagens, como o C#, é mesmo impossível* atribuir um valor a um objecto de tipo diferente.

por exepto o tipo int do c# tem métodos com toString() que converte um inteiro em string. se calhar afinal não é o básico dos básicos.

Isso é completamente diferente. Não é atribuir um valor a um tipo, é puxar um valor de um tipo. É só redefinir o magic method do toString implícito:

class  MyClass
{
    private myVal = 0;

    public function __construct($valorDefeito = 0)
    {
        $this->myVal = $valorDefeito;
    }

    public function __toString()
    {
        return $this->myVal;
    }

    public function Times($val)
    {
        return $this->myVal * $val;
    }
}

$test = new MyClass(5);

echo($test); // 5

Mas não foi isto que pediste, foi o contrário. Se te enganaste, o que queres é isto que está acima. Se não, continua a ser impossível e essa impossibilidade continua a ser básica.

* a .NET 4.0 inclui agora um tipo novo, Dynamic, que faz com que seja possível usar-se weak typing, mas é outra conversa.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
infopc

quando coloquei rails queria de facto colocar Ruby, mas como hj em dia ruby "é" rails acabei por por rails.

vê bem o tipo int em ruby é um objecto certo? então quando fazes

Test = 5

estas a criar uma variável Test que é uma instância do tipo int.  Como tudo é um objecto Test passa a ter os métodos do objecto do tipo int. continuas a poder fazer

Test= 1

  e

print Test

e ao mesmo tempo

Test.to_s //que converte em string 

assim como em c# onde tudo tb é um objecto (ou quase tudo) os tipos tambem têm metodos mesmo que sejam poucos. em ruby e por exemplo actionscript é inclusive possivel adicionar metodos a estas classes. extendendo o protótipo


O que não tem solução, solucionado esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

vê bem o tipo int em ruby é um objecto certo?

E daí? Estamos a falar de Ruby ou de PHP? Ou de C#? Ou de Python? Decide-te lá. Mas tem em mente que algumas linguagens têm tipos primitivos e outras não e que esses tipos diferem dos outros.

então quando fazes
Test = 5

estas a criar uma variável Test que é uma instância do tipo int.  Como tudo é um objecto Test passa a ter os métodos do objecto do tipo int. continuas a poder fazer

Test= 1

  e

print Test

e ao mesmo tempo

Test.to_s //que converte em string 

E?... Podes fazer exactamente o mesmo com qualquer objecto em PHP. Repara, objecto. Em PHP, os inteiros não são objectos, são tipos primitivos.

Seja como for, não foi nada disto que fizeste no tópico original: tu criaste uma classe, criaste uma nova instância dessa classe e depois atribuíste um inteiro à variável que continha essa instância, modificando-a, de facto, para um inteiro, e depois querias usar os métodos da classe anterior. Se conseguires fazer isso em Ruby exactamente como está no primeiro post, eu como as teclas do teu teclado.

em ruby e por exemplo actionscript é inclusive possivel adicionar metodos a estas classes. extendendo o protótipo

Em JavaScript também. Mais uma vez, e?... Também é possível fazer o extend (e o implement) doutra classe em PHP. So what? Mais uma vez, não foi nada disso que pediste no primeiro post.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
infopc

ai é que esta foi exactamente isto que eu pedi, uma forma de implementar isto em php se possível, mas já vi que não dá. vou marcar como resolvido.


O que não tem solução, solucionado esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.