Pergunta

Eu gostaria de realizar algo parecido com isso: chamar um método, diga "virar", e depois ter "virada" aplicada de forma diferente para diferentes tipos de dados, por exemplo, chamando de "turn" com uma "chave de fenda" usos objeto / param o método "turnScrewdriver", chamando de "turn" com um "SteeringWheel" objeto / param usa o método "turnSteeringWheel", etc. - "turn" coisas diferentes estão sendo feitas, mas eles são ambos chamados

Eu gostaria de implementar isso para que a necessidade código de chamada não se preocupar com o tipo (s) envolvido. Neste exemplo, "virar" deveria ser suficiente para "virar" a "chave de fenda", "SteeringWheel", ou o que pode ter de ser "ligado".

Em C ++ eu faria isso com sobrecarga - e C ++ iria resolver as coisas com base no tipo de dados / assinatura -. Mas isso não funciona no PHP

Todas as sugestões quanto ao local onde devo começar? A instrução switch é óbvio, mas eu estou pensando que deve haver uma solução OO (mais elegante). Não?

TIA

Foi útil?

Solução

Eu li a solução da davethegr8 mas parece um poderia fazer a mesma coisa com a digitação mais forte:

<?php

interface Turnable
{
  public function turn();
}

class Screwdriver implements Turnable
{
  public function turn() {
    print "to turning sir!\n";
  }
}

class SteeringWheel implements Turnable
{
  public function turn() {
    print "to everything, turn, turn turn!\n";
  }
}

function turn(Turnable $object) {
  $object->turn();
}

$driver = new Screwdriver();
turn($driver);

$wheel = new SteeringWheel();
turn($wheel);

$obj = new Object(); // any object that does not implement Turnable
turn($object); // ERROR!

PHP não permitem que você use um tipo de dica para o parâmetro eo tipo de dica pode ser um nome de interface em vez de um nome da classe. Então você pode ter certeza que, se os implementos $object a interface de Turnable, então deve ter o método turn(). Cada classe que implementa Turnable pode fazer sua própria coisa para fazer girar.

Outras dicas

Eu acho que isso vai funcionar ...

function turn($object) {
    if(method_exists($object, 'turn'.ucwords(get_class($object))) {
        $fname = 'turn'.ucwords(get_class($object));
        return $object->$fname();
    }

    return false;
}

Você precisa verificar o Manual PHP para obter instruções aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top