Algo como a sobrecarga em PHP?
-
20-08-2019 - |
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
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